|
說ˉ明 |
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.
| |