[古典密碼]: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;
}


發佈了49 篇原創文章 · 獲贊 15 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章