加密方法:
在维吉尼亚密码中,发件人和收件人必须使用同一个关键词(或同一段字母),这个关键词告诉他们怎么样才能前后改变字母的位置来获得该段信息中的每个字母的正确对应位置。比如:如果关键字为“BIG”,发件人将把明文中的第一个字母按“B”行来加密(向后移动1个位置,因为B是排在A后面的第1个字母),明文中的第二个字母按“I”行来加密(向后移动8个位置,因为I是排在A后面的第8个字母),明文中的第三个字母按“G”行加密(向后移动6个位置,因为G是排在A后面的第6个位置),后面再循环操作即可完成加密任务。
例如:明文:THE BUTCHER THE BAKER AND THE CANDLESTICK MAKER。
关键密钥:BIG
加密文字:UPK CCZDPKS BNF JGLMX BVJ UPK DITETKTBODS SBSKS
再例如:关键词:FOREST
明文:bettertodowellthantosaywell
密文:GSKXWKYCUSOXQZKLSGYCJEQPJZC
加密程序:
//k为加密关键词string encrypt(string mingwen,string k){string miwen = "";int cont = 0;int len = k.length(); //len为加密关键字的长度for(int i=0; i<mingwen.length(); i++){if(mingwen[i]<'a'||mingwen[i]>'z'){miwen+=mingwen[i];cont++;}else{int j = (i-cont) % len;int n = k[j]-'a';miwen += ((mingwen[i]-'a'+n)%26+'a');}}return miwen;}
解密和加密过程相反。
解密程序:
string decrypt(string miwen,string k) {string mingwen = "";int cont = 0;int len = k.length(); //len为加密关键字的长度for(int i=0; i<miwen.length(); i++){if(miwen[i]<'a'||miwen[i]>'z'){mingwen+=miwen[i];cont++;}else{int j = (i-cont) % len;int n = k[j]-'a';mingwen += (miwen[i]-'a'+26-n)%26+'a';}}return mingwen;}
完整程序:
#include<bits/stdc++.h>using namespace std;//重合指数接近0.65,用于确定秘钥长度string encrypt(string mingwen,string k);string decrypt(string miwen,string k);int main(){int i;string k=""; //加密关键字string s;ifstream fin("in.txt");ofstream fout("out.txt");cout<<"输入小写加密关键字:";cin>>k;cout<<"选择操作(1:加密 2:解密):";cin>>i;switch(i){case 1:{while(getline(fin,s)){fout<<encrypt(s,k)<<endl;}fin.close();fout.close();}break;case 2:{while(getline(fin,s)){fout<<decrypt(s,k)<<endl;}fin.close();fout.close();}break;default:cout<<"输入不合法"<<endl;break;}return 0;}//加密string encrypt(string mingwen,string k){string miwen = "";int cont = 0;int len = k.length(); //len为加密关键字的长度for(int i=0; i<mingwen.length(); i++){if(mingwen[i]<'a'||mingwen[i]>'z'){miwen+=mingwen[i];cont++;}else{int j = (i-cont) % len;int n = k[j]-'a';miwen += ((mingwen[i]-'a'+n)%26+'a');}}return miwen;}//解密string decrypt(string miwen,string k) n,string k){string mingwen = "";int cont = 0;int len = k.length(); //len为加密关键字的长度for(int i=0; i<miwen.length(); i++){if(miwen[i]<'a'||miwen[i]>'z'){mingwen+=miwen[i];cont++;}else{int j = (i-cont) % len;int n = k[j]-'a';mingwen += (miwen[i]-'a'+26-n)%26+'a';}}return mingwen;}