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

上传人:b****0 文档编号:9860824 上传时间:2023-05-21 格式:DOCX 页数:17 大小:38.45KB
下载 相关 举报
实验一实现一个多表古典加密和解密程序.docx_第1页
第1页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第2页
第2页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第3页
第3页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第4页
第4页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第5页
第5页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第6页
第6页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第7页
第7页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第8页
第8页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第9页
第9页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第10页
第10页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第11页
第11页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第12页
第12页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第13页
第13页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第14页
第14页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第15页
第15页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第16页
第16页 / 共17页
实验一实现一个多表古典加密和解密程序.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《实验一实现一个多表古典加密和解密程序.docx》由会员分享,可在线阅读,更多相关《实验一实现一个多表古典加密和解密程序.docx(17页珍藏版)》请在冰点文库上搜索。

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

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

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

实验目的:

掌握多表古典加密方法。

实验要求:

能用高级语言实现古典加密方法。

实验内容:

多表古典加密方法主要有Playfair体制、Vigenere体制、Beaufor体制、Vernam体制和Hill体制,用高级语言实现其中一种体制的加密和解密算法。

内容:

Vigenere加密解密:

#include

#include

usingnamespacestd;

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

{

if(x==(y+i))returni;

}

}

voidencryption(stringm,stringk)//加密

{

cout<<"明文:

";

cin>>m;

cout<<"密钥:

";

cin>>k;

intmlen,klen;

mlen=m.length();

klen=k.length();

char*p,*q,*t;//明文,初始密钥,密钥串。

把string换成char

p=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;i

{

t[i]=q[j];

j++;

j=j%klen;

}//生成密钥

cout<<"密文:

";

for(i=0;i

cout<

cout<

}

voiddisencryption(stringc,stringk)//解密

{

cout<<"密文:

";

cin>>c;

cout<<"密钥:

";

cin>>k;

intclen,klen;

clen=c.length();

klen=k.length();

char*p,*q,*t;//密文,初始密钥,密钥串。

把string换成char

p=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;i

{

t[i]=q[j];

j++;

j=j%klen;

}//生成密钥

cout<<"明文:

";

for(i=0;i

for(intj=0;j

if(v[number(t[i])][j]==p[i]){cout<

cout<

}

intmain()

{

for(inti=1;i

{

for(intj=0;j

{

v[i][j]=v[i-1][(j+1)%N];

}//方阵初始化

}

cout<<"欢迎使用维吉尼亚加密!

"<

cout<<"请选择要进行的操作"<

intflag;

do{

cout<<"1.加密2.解密3.结束:

"<

cin>>flag;

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加解密

#include

#include

#include

#defineNUM1000

intmain()

{

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

{

if(key[i]=='j')

key[i]='i';

}

for(i=0;i

{

for(j=i+1;j

if(key[i]==key[j])

{

for(intt=j;t

{

key[t]=key[t+1];

}

j--;

length--;

}

if(j==1)

{

key[j]=0;

break;

}

}

for(i=0;i<26;i++)

{

voa[i]=65+i;

}

for(i=0;i

{

key[i]=key[i]-32;

}

charp;

intcount=0;

for(i=0;i<26;i++)

{

p=voa[i];

for(j=0;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;i<26;i++)

{

if(key[i]=='J')

{

for(u=i;u<26;u++)

{

key[u]=key[u+1];

}

}

if(key[i]=='I')

key[i]='*';

}

temp=0;

for(i=0;i<5;i++)

{

for(j=0;j<5;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;i

{

if(word[i]==word[i+1])

{

i+=1;

counter+=1;

}

else

i+=2;

}

for(i=0;i

{

if(word[i]==word[i+1])

{

for(j=length+counter-1;j>i+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;k

{

word[k]=word[k]-32;

}

for(i=0;i

{

if(word[i]=='I'||word[i]=='J')

{

word[i]='*';

}

}

count=0,k=0;

loop:

for(i=0;i<5,k

{

for(j=0;j<5;j++)

{

for(m=0;m<5;m++)

{

for(n=0;n<5;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;k

{

printf("%c",word[k]);

}

printf("\n");

system("pause");

return0;

}

运行结果:

Vernam加解密

#include

#include

#include

usingnamespacestd;

intmain()

{

stringplain,ciper,key;

intlen;//长度三者一致

voidchange(string&,vector&);//字符变数字

vectorencrypt_compute(vectorm,vectork);//加密计算

vectordiscrypt_compute(vectorc,vectork);//解密计算

voidre_change(vector&,string&);//数字变字符

cout<<"欢迎使用Vernam加解密:

"<

cout<<"====================="<

intflag;//操作标记

do

{

cout<<"请选择操作:

1、加密2、解密3、结束:

"<

cin>>flag;

if(flag==1)

{

cout<<"请输入明文:

";

cin>>plain;

cout<<"请输入相同长度的密钥:

";

cin>>key;

len=plain.size();

vectorp,c,k;//存变换的数字

change(plain,p);

change(key,k);//字母->数字

c=encrypt_compute(p,k);

re_change(c,ciper);//数字->字母

cout<<"密文是:

"<

}

if(flag==2)

{

cout<<"请输入密文:

";

cin>>ciper;

cout<<"请输入相同长度的密钥:

";

cin>>key;

len=ciper.size();

vectorp,c,k;//存变换的数字

change(ciper,c);

change(key,k);//字母->数字

p=discrypt_compute(c,k);

plain="";//清空明文原来的值

re_change(p,plain);

cout<<"明文是:

"<

}

}while(flag!

=3);

return0;

}

voidchange(string&plain,vector&number)//字母变数字

{

for(unsignedinti=0;i

{

number.push_back(plain[i]-97);//a为0

}

}

vectorencrypt_compute(vectorm,vectork)//加密计算

{

vectorsum;

for(unsignedinti=0;i

{

sum.push_back((m[i]+k[i])%26);

}

returnsum;

}

vectordiscrypt_compute(vectorc,vectork)//解密计算

{

vectorresum;

inttemp;

for(unsignedinti=0;i

{

temp=c[i]-k[i];

if(temp<0)temp+=26;

resum.push_back(temp);

}

returnresum;

}

voidre_change(vector&sum,string&c)//数字变字符

{

stringtemp;//用于处理insert函数变量传递

for(unsignedinti=0;i

{

temp=sum[i]+97;

c.insert(i,temp);//a为0

}

}

运行结果:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2