古典密碼維吉尼亞密碼

古典密碼維吉尼亞密碼

維吉尼亞密碼原理

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;
}

加密解密結果

加密:
在這裏插入圖片描述
解密:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章