Caesar密码
2018-06-17 20:53:30来源:未知 阅读 ()
原理: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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 数据结构之顺序表的实现 2020-04-06
- C++ STL迭代器原理和实现 2020-03-14
- 协程的原理(Coroutine Theory) 2020-02-23
- 位运算的应用 2020-02-13
- C++ 一篇搞懂多态的实现原理 2020-02-01
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash