凯撒密码是单表替代密码,在古罗马的时候就很流行,是一种最简单且最广为人知的加密技术。
原理:凯撒密码加密原理很简单,将每个明文字符用字符表(循环字符表)中的后k个字符替代即可得到密文,解密即为它的逆过程(k即为密钥,且为正整数)。
加密:X→(X+k) mod 26
解密:Y→Y-k(Y>=k) Y→Y-k+26(Y<k)
例如:
若密钥k = 3,则其密文字母表就是把明文字母表循环右移3位后得到的字母表。
A={A,B,C,D,E,F,……,U,V,W,X,Y,Z}
B={D,E,F,G,H,I,……,X,Y,Z,A,B,C}
明文:I LOVE YOU
密文:L ORYH BRX
特点:简单,脆弱
破解:暴力破解
加密代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#include<iostream> #include<string> #include<stdlib.h> #include<windows.h> using namespace std; int Check(string s) { //检查输入的字符串是否为纯英文 int i = 0; while (s[i] != '\0') { if (!((s[i] >= 'a'&&s[i] <= 'z') || (s[i] >= 'A'&&s[i] <= 'Z'))) { cout << "Error!Please enter again!" << endl; Sleep(1000); return 1; } i++; } return 0; } //主函数 int main() { int b, j, k; int flag = 0; string st; char ch; system("color 2F"); //输入明文 do { fflush(stdin); system("cls"); cout << "----------Caesar cipher(Encryption)---------" << endl; cout << "Please enter the plaintext:" << endl; cout << "Plaintext:"; cin >> st; flag = Check(st); } while (flag); //输入密钥 do { fflush(stdin); cout << "key = "; cin >> b; if (b < 0 || b>26) { cout << "Invalid!Please enter again!" << endl; } } while (b < 0 || b>26); //加密并输出密文 cout << "Ciphertext: "; for (j = 0; j < st.length(); j++) { if (st[j] >= 'a'&&st[j] <= 'z') k = 'a' + (st[j] - 'a' + b) % 26; else k = 'A' + (st[j] - 'A' + b) % 26; ch = k; cout << ch; } cout << endl; } |
解密代码与加密代码几乎一致,只需在加密代码的基础上修改小部分内容即可实现。
解密代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#include<iostream> #include<string> #include<stdlib.h> #include<windows.h> using namespace std; int Check(string s) { //检查输入的字符串是否为纯英文 int i = 0; while (s[i] != '\0') { if (!((s[i] >= 'a'&&s[i] <= 'z') || (s[i] >= 'A'&&s[i] <= 'Z'))) { cout << "Error!Please enter again!" << endl; Sleep(1000); return 1; } i++; } return 0; } //主函数 int main() { int b, j, k; int flag = 0; string st; char ch; system("color 2F"); //输入密文 do { fflush(stdin); system("cls"); cout << "----------Caesar cipher(Decryption)---------" << endl; cout << "Please enter the ciphertext:" << endl; cout << "Ciphertext:"; cin >> st; flag = Check(st); } while (flag); //输入密钥 do { fflush(stdin); cout << "key = "; cin >> b; if (b < 0 || b>26) { cout << "Invalid!Please enter again!" << endl; } } while (b < 0 || b>26); //解密并输出明文 cout << "Plaintext: "; for (j = 0; j < st.length(); j++) { if (st[j] >= 'a'&&st[j] <= 'z') k = 'a' + (st[j] - 'a' - b + 26) % 26; else k = 'A' + (st[j] - 'A' - b + 26) % 26; ch = k; cout << ch; } cout << endl; } |
(编译运行环境:Visual Studio 2015)
就服这一手给cmd换颜色的操作