实验1古典密码算法文档格式.docx

上传人:b****6 文档编号:21360056 上传时间:2023-01-30 格式:DOCX 页数:20 大小:111.46KB
下载 相关 举报
实验1古典密码算法文档格式.docx_第1页
第1页 / 共20页
实验1古典密码算法文档格式.docx_第2页
第2页 / 共20页
实验1古典密码算法文档格式.docx_第3页
第3页 / 共20页
实验1古典密码算法文档格式.docx_第4页
第4页 / 共20页
实验1古典密码算法文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

实验1古典密码算法文档格式.docx

《实验1古典密码算法文档格式.docx》由会员分享,可在线阅读,更多相关《实验1古典密码算法文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

实验1古典密码算法文档格式.docx

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

 

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

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

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1