?? 凱撒和維吉尼亞加密.cpp
字號:
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#define N 50
void menu();/*顯示菜單*/
char * inputPandK();/*輸入明文和密鑰*/
void caesar();/*愷撒加密算法*/
void vigenere();/*維吉尼亞加密算法*/
int main()
{
menu();
system("PAUSE");
return 0;
}
void menu()
{
int i=0;
printf(" Clssical encrption program: \n");
printf("****0-----------EXIT **** \n");
printf("****1-----------Keasar **** \n");
printf("****2-----------Vigenere **** \n");
printf("******************************* \n");
printf("Choose your option: ");
scanf("%d",&i);
switch(i)
{
case 0: break;
case 1: caesar();
break;
case 2: vigenere();
break;
default:break;
}
}
//輸入明文和密鑰
char* inputPandK()
{
char * plntxt;//聲明一個明文指針類型
int i = 0,choose = 0;
//開辟一塊內存空間
plntxt = (char *)malloc(N * sizeof(char));
if(plntxt == NULL)
{
printf("Memory location failed!");
exit(-1);
}
/*輸入明文*/
printf("****Enter plaintext: \n");
fflush(stdin);
while(i < N)
{
plntxt[i] = getchar();
//如果輸入不合法,跳出循環,最后一個元素賦值為空
if(plntxt[i] > 126 || plntxt[i] < 32)
{
plntxt[i] = '\0';
break;
}
else
i++;
}
//返回該數組首地址
return plntxt;
}
void caesar()
{
char* _plntxt;//明文指針
int* _cphrtxt;//密文指針
unsigned int i,j;
unsigned char key = 0;
//接收明文
_plntxt = inputPandK();
printf("Enter the key:");
scanf("%c",&key);
while(!isdigit(key))
{
//key = 0;
printf("Your input is error! \n");
printf("Enter the key again: \n");
scanf("%c",&key);
}
_cphrtxt = (int *)malloc(N * sizeof(int));
if(_cphrtxt == NULL)
{
printf("Memory location failed!");
exit(-1);
}
//keasar加密算法
for(i = 0;i < strlen(_plntxt);i++)
{
if(_plntxt[i] >= 'A' && _plntxt[i] <= 'Z')
//直接轉換為小寫
_cphrtxt[i] = (_plntxt[i]%'A' + key)%26 + 'a';
else if(_plntxt[i] >= 'a' && _plntxt[i] <= 122)
//直接轉換為大寫
_cphrtxt[i] = (_plntxt[i]%'a' + key)%26 + 'A';
else
//如果為其他字符,則不變輸出
_cphrtxt[i] = _plntxt[i];
}
//輸出密文
printf("The ciphertext is :");
for(j = 0;j <= i;j++)
printf("%c",_cphrtxt[j]);
free(_plntxt);
free(_cphrtxt);
}
void vigenere()
{
char* _plntxt;
int* _cphrtxt;
char* key;
unsigned int i = 0,j;
//開辟密鑰,密文空間
key = (char *)malloc(N * sizeof(char));
if(key == NULL)
{
printf("Memory location failed!");
exit(-1);
}
_cphrtxt = (int *)malloc(N * sizeof(int));
if(_cphrtxt == NULL)
{
printf("Memory location failed!");
exit(-1);
}
//接受明文
_plntxt = inputPandK();
printf("Enter the key: \n");
fflush(stdin);
while(i < N)
{
//
key[i%strlen(key)] = getchar();
if(key[i%strlen(key)] > 126 || key[i%strlen(key)] < 32)
{
key[i%strlen(key)] = '\0';
break;
}
else
i++;
}
for(i = 0;i < strlen(_plntxt);i++)
{ //密鑰為大寫字母
if(key[i%strlen(key)] >= 'A' && key[i%strlen(key)] <= 'Z')
{ //明文為大寫字母
if(_plntxt[i] >= 'A' && _plntxt[i] <= 'Z')
_cphrtxt[i] = (key[i%strlen(key)]-'A' + _plntxt[i]-'A')%26 + 'a';
//明文為小寫字母
else if(_plntxt[i] >= 'a' && _plntxt[i] <= 'z')
_cphrtxt[i] = (key[i%strlen(key)]-'A' + _plntxt[i]-'a')%26 + 'A';
}
//密鑰為小寫
if(key[i%strlen(key)] >= 'a' && key[i%strlen(key)] <= 'z')
{ //明文為大寫字母
if(_plntxt[i] >= 'A' && _plntxt[i] <= 'Z')
_cphrtxt[i] = (key[i%strlen(key)]-'a' + _plntxt[i]-'A')%26 + 'a';
//明文為小寫字母
if(_plntxt[i] >= 'a' && _plntxt[i] <= 'z')
_cphrtxt[i] = (key[i%strlen(key)]-'a' + _plntxt[i]-'a')%26 + 'A';
}
//如果為其他字符,則不變輸出
if(key[i%strlen(key)] < 'A' || ((key[i%strlen(key)] > 'Z' && key[i%strlen(key)] < 'a')) || key[i%strlen(key)] > 'z')
_cphrtxt[i] = _plntxt[i];
}
//屏幕輸出密文
printf("The ciphertext is :");
for(j = 0;j <= i;j++)
printf("%c",_cphrtxt[j]);
free(_plntxt);
free(_cphrtxt);
free(key);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -