实验1古典密码算法文档格式.docx
《实验1古典密码算法文档格式.docx》由会员分享,可在线阅读,更多相关《实验1古典密码算法文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
![实验1古典密码算法文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/29/f474bd7b-bce7-4b55-a7b2-d2dbcb30f210/f474bd7b-bce7-4b55-a7b2-d2dbcb30f2101.gif)
begins
atfive
根据密钥cipher中各字母在字母表中出现的先后顺序,得到给定的一个置换:
f=145326
因此有:
密钥:
145326
明文:
begins
根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:
aacttk
binges
aivfte
从而得到密文:
abatgftetcnvaiikse
其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
3、算法设计
1、替代算法
采用循环移位的算法。
从键盘接收明文或密文str和密钥k,然后根据公式E(m)=(m+k)modn得到改变后的密文或明文,然后输出到屏幕。
2、置换算法
从键盘接收明文或密文str和密钥k,然后根据密钥的长度把str中的字符串存到二维数组temp1中,然后根据密钥对二维数组中的数据进行两次置换,将置换后的数组按列输出就得到了密文或明文。
4、函数接口
1、/*替代密码的加密函数*/
charsubstitute(charmessage[])//定义substitute函数
实现功能:
把用户输入的字符串使用替代密码的方式替换成密文,这里使用的密钥是4,也就是将原文的字符位置往后推4位。
返回加密密文。
2、/*解开替代密码的解密函数*/
chardesubstitute(charmessage[])//定义desubstitute函数
把密文中每个字符往前推4位,从而实现对替代密文的解密操作。
返回解密密文。
3、/*置换密码的函数*/
chartransform(charmessage[])//定义transform函数
把用户输入的原文使用置换密码的原理用二维数组进行置换操作。
返回加密后的字符串。
4、/*解开转换密码的函数*/
chardetransform(charmessage[])//定义detransform函数
对经置换密码加密后的密文进行解密。
返回解密后的字符串。
五、程序流程图
6、测试结果
1、替代密码加密:
2、替代密码解密:
3、置换密码加密:
4、置换密码解密:
7、分析两种算法的安全性
对替代算法来说:
由输入密钥k决定,密钥空间最大为26!
对置换算法而言:
根据你输入密钥空间的位数L决定,所有的置换可能构成一个L!
阶的对称群
我认为这两种算法都不是太好,但相比较而言,置换密码通过让几个一组排列成矩阵,然后对调其中的几列,打乱原先的排序,从而形成密文,相对而言,要比替代密码的算法难一些,因此,置换算法的安全性要比替代算法的安全性好些。
8、实验的体会总结
本次实验主要了解两种古典密码的算法,是对密码算法的初步认识。
而我这次的实验只能算是初步完成了实验要求,对于替代密码的算法,理解还比较深刻,而置换密码的算法,只是按照题目所给出的要求,只写出了密钥为6的程序,没有继续深入,将密钥的值更改,还有待提高。
9、实验代码
#include<
stdio.h>
stdlib.h>
string.h>
#defineMAX1000
intmain()
{
charsubstitute(chara[]);
//替代加密算法的实现
chartransform(charb[]);
//置换加密算法的实现
chardesubstitute(charc[]);
//替换解密算法的实现
chardetransform(chard[]);
//置换解密算法的实现
charmessage[MAX];
charalgorithm;
//用于选择算法
printf("
*******************************\n"
);
*欢迎进入古典算法的实现*\n"
*请按照提示选择你需要的算法*\n"
*1.替换加密2.替换解密*\n"
*3.置换加密4.置换解密*\n"
*(按q键退出程序)*\n"
请输入原文:
"
gets(message);
\n"
您刚输入的原文是:
puts(message);
请做出选择:
scanf("
%c"
&
algorithm);
while(algorithm!
='
1'
&
algorithm!
2'
q'
Q'
3'
4'
)
{
printf("
对不起,你所输入错误,请重新输入.\n"
scanf("
//接受回车字符
//接受选择出来的算法
}
if(algorithm=='
*message=substitute(message);
printf("
加密后,密文是:
//输出加密后的文件内容
elseif(algorithm=='
*message=desubstitute(message);
解密后,明文是:
//输出解密后的文件内容
*message=transform(message);
*message=detransform(message);
解密后,原文是:
elseif('
==algorithm||'
==algorithm)
退出程序!
return0;
getchar();
return0;
}
/*替代密文的加密函数*/
charsubstitute(charmessage[])//定义substitute函数
intn,i;
intk;
\n\n请输入替代密钥:
%d"
k);
for(n=0;
n<
strlen(message);
n++)//对字符串进行加密
if(message[n]>
a'
message[n]<
z'
{
message[n]=(message[n]-96+k+26*100)%26+64;
}
elseif(message[n]>
A'
Z'
message[n]=(message[n]-64+k+26*100)%26+96;
else
message[n]=message[n];
return(*message);
//返回密文
/*解开替代密文的解密函数*/
chardesubstitute(charmessage[])//定义desubstitute函数
请输入代替密钥:
n++)
message[n]=(message[n]-96-k+26*100)%26+64;
message[n]=(message[n]-64-k+26*100)%26+96;
else
//返回原文
}
/*置换密码的函数*/
chartransform(charmessage[])
inti,j,x,y,z,n,m;
n=strlen(message);
i=n/6;
j=n%6;
//I为将要规划的行数,J为要规划的列数,m为凑成6的倍数大于或者等于n
if(j==0)//字符数刚好是6的倍数,i不变,j=6,m=6*i
j=6;
m=6*i;
}
elseif(j!
=0)//字符数不是6的倍数,i加1,j=6,m=6*i;
i=i+1;
j=6;
chara[i][j];
//用来存MESSAGE
chartemp1[i][j];
chartemp2[i][j];
//申明两个数组用来作替换时用
for(x=0;
x<
i;
x++)//初始化
for(y=0;
y<
j;
y++)
a[x][y]='
'
;
temp1[x][y]='
temp2[x][y]='
if(i==1)//把字符串存入二维数组中,只有一行的情况
for(x=0;
n;
x++)
a[0][x]=message[x];
elseif(i==2)//两行字符的情况
6;
x++)
n-6;
a[1][x]=message[x+6];
}
elseif(i==3)//这里只计算最多有3行6列的内容,第三行
n-12;
a[2][x]=message[x+12];
for(z=0;
z<
z++)//将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列
temp1[z][0]=a[z][0];
z++)
temp1[z][1]=a[z][3];
temp1[z][2]=a[z][4];
temp1[z][3]=a[z][2];
temp1[z][4]=a[z][1];
temp1[z][5]=a[z][5];
temp2[z][0]=temp1[z][0];
temp2[z][1]=temp1[z][3];
temp2[z][2]=temp1[z][4];
temp2[z][3]=temp1[z][2];
temp2[z][4]=temp1[z][1];
temp2[z][5]=temp1[z][5];
z=0;
//初始化z
for(y=0;
y++,z++)
message[z]=temp2[y][x];
//将加密后的二维数组密文存入一维数组message中。
message[m]='
\0'
/*解开转换密码的函数*/
chardetransform(charmessage[])
//I为将要规划的行数,J为要规划的列数,m为6的倍数大于等于n
if(j==0)//字符数刚好是6的倍数,i不变,j=6,m=6*i
a[i][j]='
temp1[i][j]='
temp2[i][j]='
elseif(i==2)//两行字符的情况,6<
=n<
12
2;
a[x][0]=message[x];
a[x][1]=message[x+2];
a[x][2]=message[x+4];
a[x][3]=message[x+6];
a[x][4]=message[x+8];
a[x][5]=message[x+10];
elseif(i==3)//这里只计算最多有3行6列的内容
3;
a[x][1]=message[x+3];
a[x][2]=message[x+6];
a[x][3]=message[x+9];
a[x][4]=message[x+12];
a[x][5]=message[x+15];
message[z]=temp2[x][y];