实验目的与要求
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阶加密时,结果相加不正确
解决方案:外围中间数顺时针转时要注意位置
















暂无评论内容