实验一实现一个多表古典加密和解密程序.docx
《实验一实现一个多表古典加密和解密程序.docx》由会员分享,可在线阅读,更多相关《实验一实现一个多表古典加密和解密程序.docx(17页珍藏版)》请在冰点文库上搜索。
![实验一实现一个多表古典加密和解密程序.docx](https://file1.bingdoc.com/fileroot1/2023-5/21/71b8a27e-e885-4cc9-a37b-00449fca2228/71b8a27e-e885-4cc9-a37b-00449fca22281.gif)
实验一实现一个多表古典加密和解密程序
实验一实现一个多表古典加密和解密程序
实验目的:
掌握多表古典加密方法。
实验要求:
能用高级语言实现古典加密方法。
实验内容:
多表古典加密方法主要有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;icout<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;ifor(intj=0;jif(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;jif(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
}
}
运行结果: