古典密碼維吉尼亞密碼
維吉尼亞密碼原理
Vigenenre密碼是最著名的多表代換密碼,是16世紀法國著名密碼學家Vigenenre發明的。Vigenenre密碼使用一個詞組作爲密鑰,密鑰中每一個字母用來確定一個代換表,每一個密鑰字母被用來加密一個明文字母,第一個密鑰字母加密第一個明文字母,第二個密鑰字母加密第二個明文字母,等所有密鑰字母使用完後,密鑰再次循環使用,於是加解密前需先將明密文按照密鑰長度進行分組。密碼算法可表示如下:
設密鑰K=(k1,k2,…,kd),明文M=(m1,m2,…,mn),密文C=(c1,c2,…,cn);
加密變換爲:ci=Eki(mi)=mi+ki(mod 26)
解密變換爲:mi=Dki(ci)=ci-ki(mod 26)
其中k=(k1,k2,…,km)是一個長爲m的密鑰字,密鑰空間的大小爲26m,所以對一個相對小的m,窮舉密鑰也需要很長的時間。如m=7,則密鑰空間大小超過8×109,所以手工搜索非常困難。當明文的長度超過m時,可將明文串按長度m分局,然後對每一組使用密鑰k加密。
Vigenere密碼算法主要有c、m、k三個個參數。c爲密文,m是明文,k爲密鑰。
C++代碼
#include<iostream>
using namespace std;
int main()
{
int flag,i,len,lenk;
char m[50],c[50],key[50];
cout<<"維吉尼亞密碼算法!"<<endl;
cout<<"請輸入0或1:"<<endl;
cout<<"0:加密"<<endl;
cout<<"1:解密"<<endl;
cout<<"請選擇:";
cin>>flag;
switch(flag)
{
case 0:
cout<<"請輸入明文:";
cin>>m;
cout<<"請輸入祕鑰:";
cin>>key;
len=strlen(m);
lenk=strlen(key);
cout<<"加密後的密文爲:";
for(i=0;i<len;i++)
{
flag=(key[i%lenk]-'a')%26;
c[i]=(m[i]-'a'+flag)%26+'a';
cout<<c[i];
}
cout<<endl;
break;
case 1:
cout<<"請輸入密文:";
cin>>c;
cout<<"請輸入祕鑰:";
cin>>key;
len=strlen(c);
lenk=strlen(key);
cout<<"解密後的明文爲:";
for(i=0;i<len;i++)
{
flag=(key[i%lenk]-'a')%26;
if(c[i]>=key[i%lenk])
m[i]=(c[i]-'a'-flag)%26+'a';
else
m[i]=(c[i]+26-'a'-flag)+'a';
cout<<m[i];
}
cout<<endl;
break;
default:
cout<<"選擇錯誤!請選擇0或1!"<<endl;
}
return 0;
}
加密解密結果
加密:
解密: