Vigenere Cipher


說ˉ明

Vigenere Cipher 可以看成是凱撒密碼法加上多個旋轉量的一種加密法
它的明文和密文的關係如下

            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

表的最上面一行代表明文的字母, 第一列代表加密所用的金鑰, 其交會之處
則為明文的字母加密後的密文字母

例如:
	選擇金鑰為: PROVERB, 則加密的方式如下
	
        	明文: AS YOU SOW, SO SHALL YOU REAP.
        	金鑰: PR OVE RBP  RO VERBP ROV ERBP
        	密文: PJ MJY JPL, JC NLRMA PCP VVBE.

[ 下載程式碼 ]


#include <iostream>
using namespace std;
// 英文字母小寫轉大寫
char upper_case( char *m ) ;
// 加密函數, 參數 m 代表明文; 參數 key 代表金鑰
void crypt( char *m , char *key ) ;
int main()
{
        char message[] = "As you sow, so shall you reap." ;
        upper_case( message );
        cout << "Plaintext : " << message << endl ;
        char keyword[] = "PROVERB";
        cout << "  Keyword : " << keyword << endl ;
        crypt( message , keyword );
        cout << "Ciphertext: " << message << endl ;
}
char upper_case( char *m )
{
        int i , m_len = strlen( m );
        for( i = 0 ; i < m_len ; i++ )
                if ( m[i] >= 'a' && m[i] <= 'z' )
                        m[i] = m[i] - 'a' + 'A' ;
}
void crypt( char *m , char *key )
{

        int i , j , key_len = strlen( key );
	
	if( key_len == 0 ) {
		cerr << "key length can't be zero";
		return ;
	}
		
	for( i = j = 0; m[i]  != '\0' ; ++i )
		if ( m[i] >= 'A' && m[i] <= 'Z' ) 
			m[i] = (( ( m[i] - 'A' ) + ( key[ j++ % key_len] - 'A') ) % 26) + 'A' ;
			
}
輸ˉˉˉˉˉ ˉ出

Plaintext : AS YOU SOW, SO SHALL YOU REAP.
  Keyword : PROVERB
Ciphertext: PJ MJY JPL, JC NLRMA PCP VVBE.