1、替代密码和置换密码的C语言实现 实验一一、实验名称:替代密码与置换密码的实现二、实验目的:通过编程实现替代密码算法与置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。三、实验内容:A:替代密码1、实验原理:使用替代法进行加密,将明文中的字符用其她字符替代后形成密文。最早的替代密码就是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。它的加密过程可表示为: E(m) = (m+k ) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。解密算法就是:m = D(L) =(L
2、-k)mod 26;2、算法设计:使用两个函数分别进行加密与解密的过程,在主程序中通过选择加密还就是解密来调用不同函数进行替代密码的加密与解密过程实现;3、函数接口:加密:int encrypt() printf(输入明文:n); scanf(%s,a); for(i=0;ai!=0;i+) bi=ai-64; printf(输入一位密钥n); scanf(%d,&k); printf(n); for(i=0;bi!=0;i+) mi=(bi+k)%26+64; printf(%s,&m); return 0;解密:int decode() printf(输入密文:n);scanf(%s,a)
3、; for(i=0;ai!=0;i+) bi=ai-64; printf(输入一位密钥n); scanf(%d,&k); printf(n); for(i=0;bi!=0;i+) ni=(bi-k)%26+64; printf(%s,n); return 0;4、程序流程图:5、测试结果截图:加密:解密:B:1、实验原理:不改变明文字符,但就是把字符在明文中的排列顺序改变,来实现明文信息的加密。置换密码也被称为换位密码。本次实验使用的就是矩阵换位法,就是将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。解密过程就是根据密钥的字母数作为列数
4、,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵恢复正常顺序,从而恢复明文。2、算法设计:通过选择加密或解密,使用置换矩阵顺序与恢复矩阵顺序的两个函数,分别在主函数中进行调用来实现置换密码的加密解密实现;3、函数接口:加密:int jiami() int i = 0, j = 0, key_len = 0, text_len = 0, row = 0; char keyLENGTH = 0 ; char numberLENGTH = 0 ; char ptextLENGTH * 10 = 0 ; char ctextLENGTH * 10 = 0 ; printf(输入明文
5、:n); scanf(%s, ptext); i = 0; while (ptexti != 0) text_len+; i+; printf(输入密钥:n); scanf(%s, key); i = 0; while (keyi != 0) key_len+; i+; for (i = 0; ikey_len; i+) numberi = 0; for (j = 0; jkey_len; j+) if (keyjkeyi) numberi+; for (i = 0; ikey_len; i+) for (j = i + 1; jkey_len; j+) if (keyj = keyi) nu
6、mberj+; if (text_len%key_len = 0) row = text_len / key_len; else row = text_len / key_len + 1; for (i = 0; ikey_len; i+) for (j = 0; jrow; j+) ctexti*row + j = ptextnumberi + key_len*j; for (i = 0; ikey_len; i+) for (j = 0; jrow; j+) printf(%c, ctexti*row + j); return 0;解密:int jiemi() int i = 0, j =
7、 0, key_len = 0, text_len = 0, row = 0; char key1LENGTH = 0 ; char ptext1LENGTH * 10 = 0 ; char ctext1LENGTH * 10 = 0 ; char number1LENGTH = 0 ; printf(输入密文:n); scanf(%s, ctext1); while (ctext1i != 0) text_len+; i+; printf(输入密钥); scanf(%s, key1); i = 0; while (key1i != 0) key_len+; i+; for (i = 0; i
8、key_len; i+) int j = 0; number1i = 0; for (j = 0; jkey_len; j+) if (key1jkey1i) number1i+; for (i = 0; ikey_len; i+) int j = 0; for (j = i + 1; jkey_len; j+) if (key1j = key1i) number1j+; if (text_len%key_len = 0) row = text_len / key_len; else row = text_len / key_len + 1; for (i = 0; ikey_len; i+)
9、 for (j = 0; jrow; j+) ptext1number1i + key_len*j = ctext1i*row + j; for (i = 0; ikey_len; i+) for (j = 0; jrow; j+) printf(%c, ptext1i*row + j); return 0;4、程序流程图:5、测试结果截图:三、实验总结: 1、在进行替代密码实现的时候,总就是出现程序终止,然后一步步调试,还用了断点测试,最后发现就是循环的终止条件设置错误,最后经过了改正,程序能够从正常运行; 2、在进行置换实验的时候,设置的数组总就是出错,数量不足或排序错误,感觉对这一方面的
10、代码实现有很大的不足,置换数组方面忘记了很多概念,应该进行转么的复习; 3、经过这一次的实验,对古典密码中的替代密码与置换密码有了一定的了解,感觉对于密码学有了很浓厚的兴趣,想要进一步了解一些密码的算法与实现的方法; 4、感觉一个假期没有编程,忘记了很多语句与各种基本知识,感觉应该再系统地复习一遍,再多加练习。四、问题回答:替代密码:分析密文中的字母频率后将可以对照破解;可能严重偏离标准频率,加入文章少于100个字母,那么对它的解密就会比较困难。 改进:在单一恺撒密码的基础上扩展出多表密码,称为维吉尼亚密码。引入了密钥的概念,即根据密钥来决定用哪一行的密表来进行替换,可以对抗字频统计。五、实验
11、代码:A、替代密码: #include #include #includeint k,i=0;char a100;char b100,m100,n100;int encrypt() printf(输入明文:n); scanf(%s,a); for(i=0;ai!=0;i+) bi=ai-64; printf(输入一位密钥n); scanf(%d,&k); printf(n); for(i=0;bi!=0;i+) mi=(bi+k)%26+64; printf(%s,&m); return 0;int decode() printf(输入密文:n);scanf(%s,a); for(i=0;ai
12、!=0;i+) bi=ai-64; printf(输入一位密钥n); scanf(%d,&k); printf(n); for(i=0;bi!=0;i+) ni=(bi-k)%26+64; printf(%s,n); return 0;int main() int c; printf(加密选择1,解密选择2 n); scanf(%d,&c); if(c=1) encrypt(); if(c=2) decode(); return 0;B、置换密码:#include #include #define LENGTH 26int jiami() int i = 0, j = 0, key_len =
13、 0, text_len = 0, row = 0; char keyLENGTH = 0 ; char numberLENGTH = 0 ; char ptextLENGTH * 10 = 0 ; char ctextLENGTH * 10 = 0 ; printf(输入明文:n); scanf(%s, ptext); i = 0; while (ptexti != 0) text_len+; i+; printf(输入密钥:n); scanf(%s, key); i = 0; while (keyi != 0) key_len+; i+; for (i = 0; ikey_len; i+)
14、 numberi = 0; for (j = 0; jkey_len; j+) if (keyjkeyi) numberi+; for (i = 0; ikey_len; i+) for (j = i + 1; jkey_len; j+) if (keyj = keyi) numberj+; if (text_len%key_len = 0) row = text_len / key_len; else row = text_len / key_len + 1; for (i = 0; ikey_len; i+) for (j = 0; jrow; j+) ctexti*row + j = p
15、textnumberi + key_len*j; for (i = 0; ikey_len; i+) for (j = 0; jrow; j+) printf(%c, ctexti*row + j); return 0;int jiemi() int i = 0, j = 0, key_len = 0, text_len = 0, row = 0; char key1LENGTH = 0 ; char ptext1LENGTH * 10 = 0 ; char ctext1LENGTH * 10 = 0 ; char number1LENGTH = 0 ; printf(输入密文:n); sca
16、nf(%s, ctext1); while (ctext1i != 0) text_len+; i+; printf(输入密钥); scanf(%s, key1); i = 0; while (key1i != 0) key_len+; i+; for (i = 0; ikey_len; i+) int j = 0; number1i = 0; for (j = 0; jkey_len; j+) if (key1jkey1i) number1i+; for (i = 0; ikey_len; i+) int j = 0; for (j = i + 1; jkey_len; j+) if (ke
17、y1j = key1i) number1j+; if (text_len%key_len = 0) row = text_len / key_len; else row = text_len / key_len + 1; for (i = 0; ikey_len; i+) for (j = 0; jrow; j+) ptext1number1i + key_len*j = ctext1i*row + j; for (i = 0; ikey_len; i+) for (j = 0; jrow; j+) printf(%c, ptext1i*row + j); return 0;int main() int a; printf(加密选择1,解密选择2); scanf(%d, &a); if (a = 1) jiami(); else if (a = 2) jiemi(); return 0;
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2