昆明理工大学城市学院学生实验报告(2012 —2013 学年第 2 学期)课程名称:信息安全开课实验室:德信楼308 2013 年5月 8日、5月15日一、实验目的及内容学会置换密码、凯撒密码加解密算法的编程实现二、实验原理及基本技术路线欲加密的数据称为明文,明文经过某种加密算法后转换成密文,加密算法中使用的参数称之为加密密钥;密文经解密算法作用后形成明文,解密算法也有一个密钥,这两个密钥可以相同也可以不相同。
密文在网络传输中可能会被窃听,特别是在无线通信中,所有传输信息是外露的,但是由于窃听者不知道解密的方法,安全可得到相对保护。
密码通信的一条基本原则是,必须假定破译知道通用的加密方法,也就是说加密算法E 是公开的。
这种假设是合理的也是必要的,因为事实上任何一种加密算法都不可能做到完全的保密,其次一个加密算法在被公开之后仍要能经得起攻击才能称得上是一个合格的、强壮加密算法。
另外只有在对加密算法进行不断的研究、攻击和改进中,密码学才能得到发展。
既然加密算法是可能公开的,那么真正的秘密就在于密钥了,也就是说,密钥是必须保密的,它通常是一个字符串,并且可以按需要进行频繁的更换,因此以下将讨论是模型是加密算法是公开的且相对稳定,而作为参数的密钥是保密的,并且是易于更换的。
在这里密钥的长度很重要,因为找到了解密密钥也就破译了密码,而密钥长度越长,密钥空间就越大,破译密钥所花的时间就越长,破译的可能性就越小。
从破译者的角度来看,密码分析所面对的问题有三种主要的变型:当仅有密文而无明文时,我们称之为“只有密文”问题;当已有了一批相匹配的明文与密文时,称之为“已知明文”问题;当能够加密自已所选的明文时,称为“选择明文”。
从这三种角度来看,如密码系统仅能经得起“只有密文”的攻击还不能算是真正的安全,因为破译者完全可能从统计学的角度与一般的通信规律中猜测出一部分的明文,从而就会拥有一些相匹配的明文与密文,从而全部解密。
因此,真安全的密码通信系统应是,即使破译者拥有了一些匹配的明文与密文,也无从破译其它密文。
通常情况下,加密公式C=EK(P)表示明文经加密算法E和加密钥K作用后转换成密文C,并有关系:P=DK(EK(P))。
三、所用仪器、材料(设备名称、型号、规格等或使用软件)硬件要求:最少应该满足一个班一次完成实验的计算机数目(大约60台)。
软件要求:Windows XP作为操作系统,需要WinTC软件。
四、实验方法、步骤(或:程序代码或操作过程)1、置换密码程序代码:#include<stdio.h>#include<math.h>#include<string.h>#define N 100int main(){int i,j,lenK,lenM,m,n,temp;int T[N];char K[N],M[N],C[N],Temp1[N],Temp2[N],Temp3[N];printf("This is a substitution cipher...\n");printf("Please input the M::\n");gets(M);printf("Please input the K::\n");gets(K);lenK=strlen(K);lenM=strlen(M);m=lenM/lenK;n=lenK;for(i=0;i<lenK;i++){temp=0;for(j=0;j<lenK;j++){if((int)K[i]<(int)K[j]){temp+=1;}}T[i]=lenK-temp;printf("%d ",T[i]);}printf("\n\nFirst........\n\n");for(i=0;i<m;i++) {for(j=0;j<n;j++){Temp1[i*lenK+j]=M[i*lenK+j];printf("%c ",Temp1[i*lenK+j]);}printf("\n");}Temp1[lenM]='\0';printf("\nSecond........\n\n");for(i=0;i<lenK;i++){for(j=0;j<m;j++){Temp2[j*lenK+i]=Temp1[j*lenK+T[i]-1];}}Temp2[lenM]='\0';for(i=0;i<m;i++){for(j=0;j<lenK;j++){printf("%c ",Temp2[i*lenK+j]);}printf("\n");}printf("\nThird.......\n\n");for(i=0;i<lenK;i++){for(j=0;j<m;j++){Temp3[j*lenK+i]=Temp2[j*lenK+T[i]-1];}}Temp3[lenM]='\0';for(i=0;i<m;i++){for(j=0;j<lenK;j++){printf("%c ",Temp3[i*lenK+j]);}printf("\n");}printf("The substitution cipher is...\n"); for(j=0;j<lenK;j++){for(i=0;i<m;i++){printf("%c",Temp3[i*lenK+j]); }}return 0;}2、凯撒密码程序代码:五、实验过程原始记录( 测试数据、图表、计算等)1.置换密码置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。
置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。
例如,明文为attack begins at five ,密钥为cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:a t t a c kb e g i n s a t f i v e根据密钥cipher 中各个字母在字母表中出现的先后顺序,给定一个置换:123456145326f ⎡⎤=⎢⎥⎣⎦根据上面的置换,将原有居住中的字母按照第1列、第4裂、第5裂、第3裂、第2列、第6列的顺序排列,则有下面的形式:a a c t t kb i n g e s a i vf t e从而得到密文:abatgftetcnvaiikse实验结果截图:(1)输入明文(2)输入秘钥(3)明密文输出2.凯撒密码恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。
例如,当偏移量是左移3的时候(解密时的密钥就是3):明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。
需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。
例如:明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ恺撒密码的加密、解密方法还能够通过同余数的数学方法进行计算。
首先将字母用数字代替,A=0,B=1,...,Z=25。
此时偏移量为n的加密方法即为:E (x)= (x+n) mod 2解密就是:D (x)= (x-n) mod 2运行结果截图:六、实验结果、分析和结论置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。
置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。
例如,明文为attack begins at five,密钥为cipher,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:根据密钥cipher中各个字母在字母表中出现的先后顺序,给定一个置换:根据上面的置换,将原有居住中的字母按照第1列、第4裂、第5裂、第3裂、第2列、第6列的顺序排列,则有下面的形式:从而得到密文:abatgftetcnvaiikse其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
恺撒密码的基本原理是在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2个相同的元素。
密钥和协议(算法)。
凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。
置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。
心得体会通过两周的实验,我自己的收获很多。
不仅把之前所学的加密的的知识巩固了,同时也巩固了自己的C语言相关的知。
通过和同学的交流和讨论以及向老师的请教,把之前很多没有弄懂的知识学会了,让我比较系统的掌握了古典密码的原理与程序实现。
在做实验的过程中,不仅要用到课本的知识,还要到网上查阅相关的知识。
这让我大大扩充自己的视野,培养了解决问题的能力。
经常运用C语言编程,大大提高了自己的编程能力和动手能力。
其实作为密码学的基础,各类型的古典密码的原理是很简单的,难的就是你要怎样把那些看起来简单的原理用计算机程序语言进行实现,所以最重要的就是要动手。
在实际的操作中会遇到很多的问题,这是就需要和同学互相商讨,或者是向老师请教,集思广益,想方设法的才能更好的把自己的思想应用到程序中去。
这个过程让我真实的感受到编程给我带来的乐趣,同时所锻炼的动手能力也为我们以后的工作打下了坚实的基础。
在这次实验中也看到了自己的不足之处。
对于C语言的很多知识都忘了,一开始做起来很困难,我想一定是自己以前对相应的知识点了解的不够清楚。
在算法的实现中,对于一些细节方面的东西考虑的不到位,这要感谢各位同学对我的帮助和指导。