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 }