[古典密碼]:Vigenere cipher 維吉尼亞密碼
維吉尼亞密碼
Casear加密演算法的升級版:
將26個Casear密表合成一個,見下表:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A -A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B -B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C -C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D -D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E -E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F -F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G -G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H -H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I -I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J -J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K -K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L -L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M -M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N -N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O -O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P -P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q -Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R -R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S -S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T -T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U -U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V -V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W -W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X -X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y -Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z -Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
根據關鍵詞匹配出與明文對應的關鍵金鑰:
eg:THINGS ARE NOT ALWAYS WHAT THEY SEE key: MOONCAKE
:MOONCA KEM OON CAKEMO ONCA KEMO ONC
明文的T對應M,就找上表中M行替代T的字母即可
A -A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
M -M N O P Q R S T U V W X Y Z A B C D EF G H I J K L
明文:THINGS ARE NOT ALWAYS WHAT THEY SEE
密文:FVWAIS KVQ BCG CLGEKG KUCT DLQM GRG
C++實現:
#include#include#includeusing namespace std;
string nencrypted = { "Things are not always what they see" };
string ncrypted;
string keyWords = { "MoonCake" };
void Vigenere_encrypt(string &unencrypted, string &encrypted) {
encrypted.resize(unencrypted.size());
string keyWord;
for (int i = 0;i < keyWords.size();i++) {
if ((int)keyWords[i]>64 && (int)keyWords[i] < 91) {
keyWord.push_back(keyWords[i]);
}
else if ((int)keyWords[i] > 96 && (int)keyWords[i] < 123) {
keyWord.push_back(keyWords[i]-32);
}
else {
}
}
int Count = 0;
for (int i = 0;i < unencrypted.size();i++) {
if ((int)unencrypted[i]>64 && (int)unencrypted[i] < 91) {
encrypted[i] = (char)((((int)unencrypted[i] - 65 + (keyWord[(Count++)%keyWord.size()]-'A')) % 26) + 65);//減去65+k取模可得到後移k位的ascii(大寫)
}
else if ((int)unencrypted[i] > 96 && (int)unencrypted[i] < 123) {
encrypted[i] = (char)((((int)unencrypted[i] - 97 + (keyWord[(Count++) % keyWord.size()] - 'A')) % 26) + 65);//減去97+k取模可得到後移k位的ascii(小寫)
}
else {
encrypted[i] = unencrypted[i];
}
}
}
void Vigenere_decrypt(string &encrypted, string &decrypted) {
decrypted.resize(encrypted.size());
int Count = 0;
string keyWord;
for (int i = 0;i < keyWords.size();i++) {
if ((int)keyWords[i]>64 && (int)keyWords[i] < 91) {
keyWord.push_back( keyWords[i]);
}
else if ((int)keyWords[i] > 96 && (int)keyWords[i] < 123) {
keyWord.push_back(keyWords[i] - 32);
}
else {
}
}
for (int i = 0;i < encrypted.size();i++) {
if ((int)encrypted[i]>64 && (int)encrypted[i] < 91) {
decrypted[i] = (char)((((int)encrypted[i] - 65 + 52 - (keyWord[(Count++) % keyWord.size()] - 'A') ) % 26) + 65);//減去65-k取模可得到前移k位的ascii(大寫) //加26使其非負
}
else if ((int)encrypted[i] > 96 && (int)encrypted[i] < 123) {
decrypted[i] = (char)((((int)encrypted[i] - 97 + 52 - (keyWord[(Count++) % keyWord.size()] - 'A') ) % 26) + 65);//減去97-k取模可得到前移k位的ascii(小寫)//加26使其非負
}
else {
decrypted[i] = encrypted[i];
}
}
}
int main() {
Vigenere_encrypt(nencrypted, ncrypted);
cout << ncrypted << endl;
Vigenere_decrypt(ncrypted, nencrypted);
cout << nencrypted << endl;
return 0;
}