700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 维吉尼亚密码加密解密

维吉尼亚密码加密解密

时间:2018-09-20 10:39:13

相关推荐

维吉尼亚密码加密解密

加密方法:

在维吉尼亚密码中,发件人和收件人必须使用同一个关键词(或同一段字母),这个关键词告诉他们怎么样才能前后改变字母的位置来获得该段信息中的每个字母的正确对应位置。比如:如果关键字为“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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。