置换密码程序设计

实验目的与要求

1. 帮助学生掌握置换密码的加密解密过程,能够利用所学过的编程语言,实现加解密算法。使学生掌握编程实现实际问题中的方法,提高专业技能和专业素养。

2. 要求学生掌握算法的程序实现的方法,能应用密码算法的特点,设计合适的交互界面,并能正确实现应用编程。

实验原理与内容

置换密码加密解密过程 

设明文为:4D 61 65 53 2D 4F 69 20 4E。密钥为10,8,1,6,3,0,11,5,7,17,4,12,13,14,9,15,2,16。求加密后的16进制密文。

解 先思考和描述算法,也就是对明文4D 61 65 53 2D 4F 69 20 4E实现置换10,8,1,6,3,0,11,5,7,17,4,12,13,14,9,15,2,16。通过对数组赋值实现:

m(i)={4D 61 65 53 2D 4F 69 20 4E},i=1,2,3,…,9。

    k(i)={ 10,8,1,6,3,0,11,5,7,17,4,12,13,14,9,15,2,16},i=0,1,2,3,…,17。

c(i)=m(k(i)), i=0,1,2,3,…,17。

c(0),c(1),…,c(17)为密文。

密文序列为: 。

这样可以推广到任意置换。有这个思维才可以编程实现,因此,思想方法更重要。

幻方密码加密解密过程(即置换密码的解密) 

设明文为:4D 61 65 53 2D 4F 69 20 4E。密钥为10,8,1,6,3,0,11,5,7,17,4,12,13,14,9,15,2,16。求加密后的16进制密文。

解 先思考和描述算法,也就是对明文4D 61 65 53 2D 4F 69 20 4E实现置换10,8,1,6,3,0,11,5,7,17,4,12,13,14,9,15,2,16。通过对数组赋值实现:

m(i)={4D 61 65 53 2D 4F 69 20 4E},i=1,2,3,…,9。

    k(i)={ 10,8,1,6,3,0,11,5,7,17,4,12,13,14,9,15,2,16},i=0,1,2,3,…,17。

c(i)=m(k(i)), i=0,1,2,3,…,17。

c(0),c(1),…,c(17)为密文。

密文序列为: 。

这样可以推广到任意置换。有这个思维才可以编程实现,因此,思想方法更重要。

实验内容及拓展

实验原理已包含实验内容,下面所说的只是拓展实验内容实现的难点:

1. 设计交互图形界面;

2. 字符的转换

3. 文件的读取。

五、实验步骤

. 输入明文和密钥输出密文,根据密文和密钥推出明文
 

实验设备与软件环境

1. PC Windows环境

实验过程与结果(可贴图)

置换加密与解密

1. 置换思维导图(加密解密)

2. 明文输入及输出密钥要求,要求为密钥长度需等于明文长度,密钥只能为数字

 

3. 密钥判断

当选择1时,需要手动密钥,当选择2时即可自动生产密钥,当随机生产密钥不满意时可以一直重复输入2,直到满意为之,输入3。

4.当选择1手动输入时,判断手动输入的密钥长度是否等于明文长度

 

当选择1时,重新输入明文,然后判断;当选择2时,重新手动输入密钥,然后判断。

5. 开始置换

把明文按照密文的数字位置进行置换,再输出明文和密文

6. 解密

 

根据求出的密文与给出的密钥,求逆得到明文

幻方置换加密与解密

1. 构建函数把列表存储的数循环左移遍历

2. 构建函数把列表存储的数循环右移遍历

3. 构建奇数阶幻方

(1)思路:利用罗伯法的口诀创建幻方

1.每一个数放在前一个数的右上一格;
2.如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
3.如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
4.如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;
5.如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

 (2)代码如下

(3)运行结果如下:

 

 通过输入数字,生成一个n*n阶的幻方,生成幻方后再通过每行每列以及斜对角的和相等进行验证,证明幻方可行。

4n阶幻方

思路:

外四角的4个数逆时针循环
内四角的4个数逆时针循环
外围中间的数为一组,4组数顺时针循环

 代码:

运行结果:

 

通过输入数字,生成一个n*n阶的幻方,生成幻方后再通过每行每列以及斜对角的和相等进行验证,证明幻方可行。

构建4n+2阶幻方

思路:

1.4*n+2,乍一看就较4*n麻烦了,事实也是如此,不过它的思想也简单。就是将4*n+2看做2*(2*n+1),这样一来就转化成了四个2*n+1求幻方,分别叫A、B、C、D
①.将1,2,…,(2*n+1)*(2*n+1)这些数划分给A,并对A实现奇数幻方;
②.将(2*n+1)*(2*n+1)+1,…,2*(2*n+1)*(2*n+1)这些数划分给B,并对B实现奇数幻方;
③.将2*(2*n+1)*(2*n+1)+1,…3*(2*n+1)*(2*n+1)这些数划分C,并对C实现奇数幻方;
④.将3*(2*n+1)*(2*n+1)+1,…4*(2*n+1)*(2*n+1)这些数划分D,并对D实现奇数幻方。
从A表中的中心开始,按照从左向右的方向,标出n个数,A表中的其他行则标出最左边的n格中的数。将A表的中心数和C表的中心数交换,A表的第一个数和C表的第一个数交换,A表的第七个数和C表的第七个数交换。

 代码:

运行结果:

 

通过输入数字,生成一个n*n阶的幻方,生成幻方后再通过每行每列以及斜对角的和相等进行验证,证明幻方可行。

幻方加密运算代码如下

 

 解密

 循环遍历密钥元素,通过下表y访问密文,并将其赋值给列表的第一个数,完成第一个明文的解密,以此类推。

加密与解密过程运行截图

操作异常问题与解决方案

操作异常:置换时,输出的结果错误

解决方案:检查输入的密钥与明文的长度是否相等,加一个判断条件,如果不相等将重新输入明文或者密钥。

操作异常:随机生成密钥时,密文与明文一样

解决方案:随机生产密钥时,加上随机范围并增加密钥与明文长度相等的条件,确保随机产生的密钥符合规则

操作异常:输入2随机生产密钥时,一直随机生成,没有跳到下一步

解决方案:加一个判断条件,当输入3时,停止循环跳到下一步

操作异常:写幻方置换加密时,手动输入密钥经常不符合标准

解决方案:按照幻方密钥的生成的标准有电脑随机产生

操作异常:当手动输入小于2的阶级幻方时,报错

解决方案:电脑随机生成的幻方阶级>=3,才可继续下一步

操作异常:幻方加密的密钥不想要,比较复杂

解决方案:设定一个变量,每一次生成完随机密钥时询问是否继续生成

操作异常:在写4n阶加密时,结果相加不正确

解决方案:外围中间数顺时针转时要注意位置

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容