实验一实现一个多表古典加密和解密程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验一实现一个多表古典加密和解密程序实验目的:掌握多表古典加密方法。实验要求:能用高级语言实现古典加密方法。实验内容:多表古典加密方法主要有Playfair体制、Vigenere体制、Beaufor体制、Vernam体制和Hill体制,用高级语言实现其中一种体制的加密和解密算法。内容:Vigenere加密解密:#includeiostream#includestringusingnamespacestd;constintN=26;charv[N][N]={{'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'}};intnumber(charx)//把行号字母对应到数字{chary='a';for(inti=0;iN;i++){if(x==(y+i))returni;}}voidencryption(stringm,stringk)//加密{cout明文:;cinm;cout密钥:;cink;intmlen,klen;mlen=m.length();klen=k.length();char*p,*q,*t;//明文,初始密钥,密钥串。把string换成charp=newchar[m.length()+1];strcpy(p,m.c_str());q=newchar[k.length()+1];strcpy(q,k.c_str());t=newchar[m.length()+1];intj=0;for(inti=0;imlen;i++){t[i]=q[j];j++;j=j%klen;}//生成密钥cout密文:;for(i=0;imlen;i++)coutv[number(t[i])][number(p[i])];coutendl;}voiddisencryption(stringc,stringk)//解密{cout密文:;cinc;cout密钥:;cink;intclen,klen;clen=c.length();klen=k.length();char*p,*q,*t;//密文,初始密钥,密钥串。把string换成charp=newchar[c.length()+1];strcpy(p,c.c_str());q=newchar[k.length()+1];strcpy(q,k.c_str());t=newchar[c.length()+1];intj=0;for(inti=0;iclen;i++){t[i]=q[j];j++;j=j%klen;}//生成密钥cout明文:;for(i=0;iclen;i++)for(intj=0;jN;j++)if(v[number(t[i])][j]==p[i]){coutchar(j+97);break;}coutendl;}intmain(){for(inti=1;iN;i++){for(intj=0;jN;j++){v[i][j]=v[i-1][(j+1)%N];}//方阵初始化}cout欢迎使用维吉尼亚加密!endlendl;cout请选择要进行的操作endl;intflag;do{cout1.加密2.解密3.结束:endl;cinflag;stringm,k;if(flag==1)encryption(m,k);elseif(flag==2)disencryption(m,k);elseif(flag!=1&&flag!=2&&flag!=3)cout输入错误,请重新输入!;}while(flag!=3);return0;}运行结果:Playfair加解密#includestdio.h#includestdlib.h#includestring.h#defineNUM1000intmain(){inti,j,k=0,m,n,temp=0,length;charkey[NUM],voa[26];chartable[5][5];charword[NUM];printf(欢迎使用playfair加密!);printf(密钥:);scanf(%s,key);length=strlen(key);for(i=0;ilength;i++){if(key[i]=='j')key[i]='i';}for(i=0;ilength;i++){for(j=i+1;jlength;j++)if(key[i]==key[j]){for(intt=j;tlength;t++){key[t]=key[t+1];}j--;length--;}if(j==1){key[j]=0;break;}}for(i=0;i26;i++){voa[i]=65+i;}for(i=0;ilength;i++){key[i]=key[i]-32;}charp;intcount=0;for(i=0;i26;i++){p=voa[i];for(j=0;jlength;j++){if(p==key[j]){key[i+length]=p;count+=1;break;}}if(j==length){key[i+length-count]=p;}}intu=0;for(i=0;i26;i++){if(key[i]=='J'){for(u=i;u26;u++){key[u]=key[u+1];}}if(key[i]=='I')key[i]='*';}temp=0;for(i=0;i5;i++){for(j=0;j5;j++){table[i][j]=key[j+temp];printf(%c,table[i][j]);if(j==4){temp+=5;printf(\n);}}}printf(明文:);scanf(%s,word);length=strlen(word);intcounter=0;for(i=0;ilength;){if(word[i]==word[i+1]){i+=1;counter+=1;}elsei+=2;}for(i=0;ilength+counter;i+=2){if(word[i]==word[i+1]){for(j=length+counter-1;ji+1;j--){word[j]=word[j-1];}word[i+1]='x';}}length=length+counter;if(length%2!=0){word[length]='x';length+=1;}for(k=0;klength;k++){word[k]=word[k]-32;}for(i=0;ilength;i++){if(word[i]=='I'||word[i]=='J'){word[i]='*';}}count=0,k=0;loop:for(i=0;i5,klength;i++){for(j=0;j5;j++){for(m=0;m5;m++){for(n=0;n5;n++){if((table[i][j]==word[k])&&(table[m][n]==word[k+1])&&(i==m)){count=1;word[k]=table[i][j+1];word[k+1]=table[m][n+1];if(j==4){word[k]=table[i][0];}if(n==4){word[k+1]=table[m][0];}k+=2;if(count==1){gotoloop;}}elseif((table[i][j]==word[k])&&(table[m][n]==word[k+1])&&(j==n)){count=1;word[k]=table[i+1][j];word[k+1]=table[m+1][n];if(i==4){word[k]=table[0][j];}if(m==4){word[k+1]=table[0][n];}k+=2;if(count==1){gotoloop;}}elseif((table[i][j]==word[k])&&(table[m][n]==word[k+1])&&(i!=m)&&(j!=n)){count=1;word[k]=table[i][n];word[k+1]=table[m][j];k+=2;if(count==1){gotoloop;}}}}}}printf(密文:);for(k=0;klength;k++){printf(%c,word[k]);}printf(\n);system(pause);return0;}运行结果:Vernam加解密#includeiostream#includestring#includevectorusingnamespacestd;intmain(){stringplain,ciper,key;intlen;//长度三者一致voidchange(string&,vectorint&);//字符变数字vectorintencrypt_compute(vectorintm,vectorintk);//加密计算vectorintdiscrypt_compute(vectorintc,vectorintk);//解密计算voidre_change(vectorint&,string&);//数字变字符cout欢迎使用Vernam加解密:endl;cout=====================endl;intflag;//操作标记do{cout请选择操作:1、加密2、解密3、结束:endl;cinflag;if(flag==1){cout请输入明文:;cinplain;cout请输入相同长度的密钥:;cinkey;len=plain.size();vectorintp,c,k;//存变换的数字change(plain,p);change(key,k);//字母-数字c=encrypt_compute(p,k);re_change(c,ciper);//数字-字母cout密文是:ciperendl;}if(flag==2){cout请输入密文:;cinciper;cout请输入相同长度的密钥:;cinkey;len=ciper.size();vectorintp,c,k;//存变换的数字change(ciper,c);change(key,k);//字母-数字p=discrypt_compute(c,k);plain=;//清空明文原来的值re_change(p,plain);cout明文是:plainendl;}}while(flag!=3);return0;}voidchange(string&plain,vectorint&number)//字母变数字{for(unsignedinti=0;iplain.size();i++){number.push_back(plain[i]-97);//a为0}}vectorintencrypt_compute(vectorintm,vectorintk)//加密计算{vectorintsum;for(unsignedinti=0;im.size();i++){sum.push_back((m[i]+k[i])%26);}returnsum;}vectorintdiscrypt_compute(vectorintc,vectorintk)//解密计算{vectorintresum;inttemp;for(unsignedinti=0;ic.size();i++){temp=c[i]-k[i];

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功