四种古典密码的C++实现(4)-----Caesar密码
1 //Caesar密码 2 /*理解算法最重要,最好自己动手实现试试看,可以使用MFC写一个简单的交互界面*/ 3 #include<iostream> 4 #include<cmath> 5 using namespace std; 6 7 #define N 1000 8 //全局变量 9 char str[100]; //用于存储处理前字符串 10 char enstr[100]; //用于存储处理后字符串 11 int num=0; //用于累计字符数量 12 char *p; //用于指向处理字符串 13 int key; 14 15 //加密 16 void encryption() 17 { 18 while(*p!='\0') 19 { 20 *p=(*p-97+key)%26+97; 21 p++; 22 } 23 cout<<"加密后字符:"<<str<<endl<<endl; 24 } 25 //解密 26 void decryption() 27 { 28 while(*p!='\0') 29 { 30 *p=(*p-71-key)%26+97; 31 p++; 32 } 33 cout<<"解密后字符:"<<str<<endl<<endl; 34 } 35 //单文字破解 36 void get_key() 37 { 38 char e; 39 char d; 40 cout<<"请输入已知位置明文:"; 41 cin>>e; 42 cout<<"请输入已知位置密文:"; 43 cin>>d; 44 key=abs(e-d)%26; 45 cout<<"密钥为:"<<key<<endl; 46 } 47 //全结果破解 48 void decrypt() 49 { 50 char x[N]; 51 52 cout<<"请输入加密后的明文:\n"; 53 cin>>x; 54 for(int i=1;i<=25;++i) 55 { 56 for(int j=0;;++j) 57 { 58 if(x[j]>96&&x[j]<123) 59 x[j]=(x[j]-1-122)%26+122; 60 else if(x[j]>64&&x[j]<91) 61 x[j]=(x[j]-1-90)%26+90; 62 else 63 x[j]=x[j]; 64 if(x[j]==0) break; 65 } 66 cout<<"秘钥为 "<<i<<"时,此秘钥加密前的原文为:"<<x<<endl; 67 } 68 } 69 //主函数 70 int main() 71 { 72 string ord; 73 while(1) 74 { 75 cout<<"请选择功能:\n"; 76 cout<<"1.Encryption(加密)\n2.Decryption(解密)\n3.Decipher(破解)\n4.Exit(退出) : "; 77 78 p=str; 79 cin>>ord; 80 if(ord=="1") 81 { 82 cout<<"Input:请输入需要加密的内容(不支持空格和其他字符)"<<endl; 83 cin>>str; 84 p=str; 85 cout<<"Key:请输入密钥 "; 86 cin>>key; 87 encryption(); 88 89 } 90 else if(ord=="2") 91 { 92 cout<<"Input:请输入需要解密的内容(不支持空格和其他字符):"<<endl; 93 cin>>str; 94 p=str; 95 cout<<"Key:请输入密钥 "; 96 cin>>key; 97 decryption(); 98 } 99 else if(ord=="3") 100 { 101 cout<<"完全未知密文,输入明文列出所有可能请输入 1;\n已知某个明文字母的对应密文请输入 2;\n"; 102 int choose; cin>>choose; 103 if(choose==1) 104 decrypt(); 105 else if(choose==2) 106 get_key(); 107 } 108 else if(ord=="4") break; 109 else 110 { 111 cout<<"Error :输入错误,请重新开始\n"; 112 continue; 113 } 114 115 } 116 117 return 0; 118 }