Caesar密码

2018-06-17 20:53:30来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

原理:Caesar采用循环移位对明文进行加密。

加密:通过循环移位对明文进行加密。

密钥:1-25之间的任意整数。

比如:明文ABCD

通过密钥1加密后的密文为BCDE;

通过密钥2加密后的密文为CDEF;

通过密钥3加密后的密文为DEFG;

通过密钥4加密后的密文为EFGH;

通过密钥5加密后的密文为FGHI;

通过密钥6加密后的密文为HIJK;

通过密钥7加密后的密文为IJKL;

……

以此类推。

解密:加密的逆运算,通过暴力攻击的方法对密文进行解密,尝试25个密钥,可以得到25种密文,由于需要判断解密之后的明文是否正确,需要对此结果进行分析,通过导入.txt字典文件,将词库中的单词与之比对,如果词库中存在该单词,则很大程度说明此次解密成功,此次解密对应的密钥为正确密钥。

查字典:25次解密,在每次解密过程当中,都在词库中查询解密出来的第一个单词,如果存在,就输出“解密成功”,反之亦然。

算法流程:

 

代码实现:(.txt文件自行导入

 1 #include<iostream>
 2 #include<fstream>
 3 #include<sstream>
 4 #include<string>
 5 #include<map>
 6 #include<vector>
 7 using namespace std;
 8 
 9 //加密
10 void encrypt(string &message, int key)
11 {
12     char ch = '\0';
13     for (unsigned int i = 0; i < message.length(); i++)
14     {
15         if (message[i] >= 'a'&&message[i] <= 'z'){
16             ch = 'a';
17         }
18         else if (message[i] >= 'A'&&message[i] <= 'Z') {
19             ch = 'A';
20         }
21         if (message[i] >= 'A'&&message[i] <= 'Z' || message[i] >= 'a'&&message[i] <= 'z')
22         {
23             message[i] = ch + (message[i] - ch + key) % 26;
24         }
25     }
26 }
27 
28 //解密
29 void decrypt(string &message, int key)
30 {
31     char ch = '\0';
32     for (unsigned int i = 0; i < message.length(); i++)
33     {
34         if (message[i] >= 'a'&&message[i] <= 'z'){
35             ch = 'a';
36         }
37         else if (message[i] >= 'A'&&message[i] <= 'Z'){
38             ch = 'A';
39         }
40         if (message[i] >= 'A'&&message[i] <= 'Z' || message[i] >= 'a'&&message[i] <= 'z')
41         {
42             message[i] = ch + (message[i] - ch + 26 - key) % 26;
43         }
44     }
45 }
46 
47 
48 int main()
49 {
50     string message = "";
51     cout << "请输入明文:" << endl;
52     getline(cin, message, '\n');
53     int key = 0;
54     cout << "请输入密钥key(1-25):" << endl;
55     cin >> key;
56     encrypt(message, key);
57     cout << "加密后的密文为:" << message << endl;
58 
59 
60     ifstream infile("C:\\Users\\yinyin\\Desktop\\Caesar\\caesar\\dictionary.txt", ios::in);
61     if (!infile)
62     {
63         cerr << "open file error!" << endl;
64         return 0;
65     }
66     vector<string> v;
67     bool isFind = false;
68 
69     for (int i = 1; i <= 25; i++)
70     {
71         decrypt(message, 1);
72         cout << "" << i << "次解密:" << message << endl;
73 
74         bool isFind = false;
75         string word;
76 
77         while (infile >> word)     //读入单词至word
78         {
79             if (message == word)
80             {
81                 isFind = true;
82                 cout << "" << i << "次解密成功, 明文为:" << message << endl;
83             }
84         }
85     }
86     if (isFind == false)
87     {
88         cout << "查找失败,解密失败!!!";
89     }
90 
91     return 0;
92 }

 运行结果:

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:BZOJ3687: 简单题(dp+bitset)

下一篇:BZOJ1058: [ZJOI2007]报表统计(set)