Vigenère密码描述:
可见,在Vigenère密码中,每个密钥K相当于长度为r的字母串。算法每次处 理r个明文字母,并重复使用密钥字母,直至所有的明文序列均被加密。
加密过程简单描述:
解密过程简单描述:
假设明文为 【ILOVEYOU】,密钥:【WHY】
对于密文为:【ESMRLWKB】
先转化为数字(这里下标从0开始数,为了编码方便)
则
I , L , O, V , E , Y , O , U 【W , H , Y】
8 ,11 , 14, 21, 4 ,24 ,14 ,20 【22,7,24】
加密过程为:
C1=(8+22) mod26 = 4 —>E
C2=(11+7) mod26 = 18—>S
C3=(14+24) mod26 = 12—>M
C4=(21+22) mod26 = 17—>R
C5=(4+7) mod26 = 11—>L
C6=(24+24) mod26 = 22—>W
C7=(14+22) mod26 = 10—>K
C8=(20+7) mod26 = 1—>B
对于解密过程就是如上述公式计算即可。
代码
#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
char alphabet[26]={'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'};
//int k[9]={7,0,15,15,24,19,8,12,4};
int k[3]={22,7,24};
int r=3;
char encode_vigenere(int a,int i){
//cout<<a<<" "<<k[i%r]<<" "<<(a + k[i%r] ) % 26<<endl;
return alphabet[(a + k[i%r] ) % 26] ;
}
char decode_vigenere(int c,int i){
// cout<<c<<" "<<k[i%r]<<" "<<(c - k[i%r] ) % 26<<endl;
return (alphabet[(c - k[i%r] ) % 26])>0?(alphabet[(c - k[i%r] ) % 26]):(alphabet[(c - k[i%r])%26 +26 ]) ;
}
int main(){
char str[18]="ILOVEYOU";
//char str[9] ="FTNSMXLC";
for(int i=0;i<8;i++){
int tmp = (int)str[i] - 65;
cout<<encode_vigenere(tmp,i);
}
}