置换密码原理:把明文中的字母重新排列,字母本身不变,但其位置改变了,这样编成的密码称为置换密码。置换密码又称为移位密码,因为对照明密文来看,字母的位置被移动了。
加密代码实现:
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
#include <iostream> #include <string> #include <string.h> #include <unistd.h> using namespace std; struct group { char ch = '\0'; int num = -1; }; 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; return 1; } i++; } return 0; } //处理密钥,返回指针数组 int *wordKey(string key, int k[20]) { int i, j; // int k[20] = { 0 }; int *p = k; int flag = 0; char temp1; char tem[20] = { 0 }; char keygroup[20] = { 0 }; for (i = 0; i < key.length(); i++) {//设置临时数组 keygroup[i] = key[i]; } //冒泡排序 for (i = 0; i < key.length(); i++) { flag = 0; for (j = 0; j < key.length() - i - 1; j++) { if (keygroup[j] > keygroup[j + 1]) { temp1 = keygroup[j]; keygroup[j] = keygroup[j + 1]; keygroup[j + 1] = temp1; flag = 1; } } if (flag == 0) break; } //设置临时数组 for (i = 0; i < key.length(); i++) { tem[i] = keygroup[i]; } //对应的密钥顺序 cout << endl << "key = (d, f)" << endl; cout << "d = " << key.length() << " "; cout << "f = ("; for (i = 0; i < key.length(); i++) { for (j = 0; j < key.length(); j++) { if (keygroup[j] == key[i] && tem[j] != '#') { k[i] = j + 1; tem[j] = '#'; cout << " " << k[i]; break; } } } cout << " )" << endl << endl; return p; } int main(){ int flag = 0; int i, j, t; int k[20] = { 0 }; int *p; char tem[20] = { 0 }; char keygroup[20] = { 0 }; char plain[30] = { 0 }; char cipher[30] = { 0 }; string st, key; group list[10]; do { fflush(stdin); cout << "-------------Permutation cipher(Encryption)------------" << endl; cout << " the null letter is 'x' " << endl; cout << "Please enter the plaintext:"; cin >> st; flag = Check(st); } while (flag); do { //输入key fflush(stdin); cout << "Please enter the key: "; cin >> key; flag = Check(key); } while (flag); //明文不是key的整数倍补'x' t = st.length(); if (t%key.length() != 0) t = ((t / (key.length()) + 1)*key.length()); for (i = 0; i < t; i++) { if (i < st.length()) plain[i] = st[i]; else plain[i] = 'x'; } p = wordKey(key, k); //展示 cout << " "; for (i = 0; i < (strlen(plain) / key.length()); i++) { for (j = 0; j < key.length(); j++) { cout << p[j]; } cout << " "; } cout << endl; for (i = 0; i < strlen(plain); i++) { if ((i%key.length()) == 0) cout << " "; cout << plain[i]; } cout << endl << endl; //整理密文 for (i = 0; i < t / (key.length()); i++) { for (j = 0; j < key.length(); j++) { cipher[i*key.length() + p[j] - 1] = plain[i*key.length() + j]; } } //输出密文 cout << "CipherText:"; for (i = 0; i < strlen(cipher); i++) { cout << cipher[i]; } cout << endl << endl; return 0; } |
解密代码实现:
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
#include <iostream> #include <string> #include <string.h> #include <unistd.h> using namespace std; struct group { char ch = '\0'; int num = -1; }; 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; return 1; } i++; } return 0; } //处理密钥,返回指针数组 int *wordKey(string key, int k[20]) { int i, j; // int k[20] = { 0 }; int *p = k; int flag = 0; char temp1; char tem[20] = { 0 }; char keygroup[20] = { 0 }; for (i = 0; i < key.length(); i++) {//设置临时数组 keygroup[i] = key[i]; } //冒泡排序 for (i = 0; i < key.length(); i++) { flag = 0; for (j = 0; j < key.length() - i - 1; j++) { if (keygroup[j] > keygroup[j + 1]) { temp1 = keygroup[j]; keygroup[j] = keygroup[j + 1]; keygroup[j + 1] = temp1; flag = 1; } } if (flag == 0) break; } //设置临时数组 for (i = 0; i < key.length(); i++) { tem[i] = keygroup[i]; } //对应的密钥顺序 cout << endl << "key = (d, f)" << endl; cout << "d = " << key.length() << " "; cout << "f = ("; for (i = 0; i < key.length(); i++) { for (j = 0; j < key.length(); j++) { if (keygroup[j] == key[i] && tem[j] != '#') { k[i] = j + 1; tem[j] = '#'; cout << " " << k[i]; break; } } } cout << " )" << endl << endl; return p; } int main(){ int flag = 0; int i, j; int k[20] = { 0 }; int *p; char tem[20] = { 0 }; char keygroup[20] = { 0 }; char plain[30] = { 0 }; char cipher[30] = { 0 }; string st, key; group list[10]; do { fflush(stdin); system("cls"); cout << "-------------Permutation cipher(Decryption)------------" << endl; cout << "Please enter the ciphertext:"; cin >> st; flag = Check(st); } while (flag); do { //输入key fflush(stdin); cout << "Please enter the key: "; cin >> key; flag = Check(key); } while (flag); if (((st.length()) % (key.length())) != 0) { cout << endl << "Error!The length of the ciphertext must be an integral multiple of the length of the key!" << endl << endl; exit(-1); } p = wordKey(key, k); //展示 cout << " "; for (i = 0; i < (st.length() / key.length()); i++) { for (j = 0; j < key.length(); j++) { cout << p[j]; } cout << " "; } cout << endl; for (i = 0; i < st.length(); i++) { if ((i%key.length()) == 0) cout << " "; cout << st[i]; } cout << endl << endl; cout << "PlainText:"; for (i = 0; i < (st.length() / key.length()); i++) { for (j = 0; j < key.length(); j++) { cout << st[(i*key.length() + p[j] - 1)]; } } cout << endl << endl; return 0; } |
(编译运行环境:g++ [Debian 7.3.0-19] 7.3.0)
说点什么