信息安全实验报告课程名称: _ 专业:计算机科学与技术 _2010_级_02班实验编号:实验项目_ 指导教师_ _姓名:闫斌学号: 2010012854 实验成绩:___实验一古典密码算法实验名称:古典密码算法实验类型: 设计性实验学时:4适用对象: 信息安全1.实验原理古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。
2.实验目的通过变成实现替代密码算法和置换密码算法,加深对古典密码体质的了解,为深入学习密码学奠定基础。
3.实验环境运行windows或linux操作系统的pc机,具有gcc(linux)、VC(Windows)等C语言编译环境。
4.实验内容4.1替代密码算法4.1.1根据实验远离部分对替代密码算法的介绍,创建明文信息,并选择一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作。
替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。
4.1.2替代密码算法的远离是使用替代法进行加密,就是将明文的字符用其他字符替代后形成密文。
例如字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
4.1.3 代码#include<stdio.h>#include<math.h>#include<string.h>#define N 500int main(){/*--------------------------------*/int i=0,k,m,n,l;char str1[N],str2[N]; /*C=M+K...K is key...*/clrscr();/*--------------------------------*/printf("This is a code password program......\n");printf("Please input proclaimed in writing(M)::\n");gets(str1);/*输入要加密的明文M*/printf("Please input the key(K)(int)::\n");scanf("%d",&k);/*输入密钥K*/m=strlen(str1);/*测试明文的长度*/printf("The M length is %d\n",m);printf("\n *\n *\n *\n***\n *\n");printf("ciphertext(C) is ::\n\n");for(i=0;i<m;i++)/*加密的过程*/{n=(int)str1[i];/*将字符转换成ASCII*/if(str1[i]==' ')/*如果字符串中出现空格返回空格*/{printf(" ");str2[i]=str1[i];}else if(n>96&&n<123)/*对小写进行加密*/{n=(n-97+k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);str2[i]=l;}else if(n>64&&n<91)/*对大写进行加密*/{n=(n-65+k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);str2[i]=l;}}str2[i]='\0';/*--------------------------------*/printf("\n\nThe C length is %d",strlen(str2));printf("\n\n *\n *\n *\n***\n *\n");printf("When the ciphertext is '%s',\nThe password program is...::\n\n",str2);m=strlen(str2);for(i=0;i<m;i++)/*解密过程*/{n=(int)str2[i];/*将字符转换成ASCII*/if(str2[i]==' ')/*如果是空格,返回的也是空格*/{printf(" ");}else if(n>96&&n<123)/*对小写进行解密*/{n=(n-97-k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);}else if(n>64&&n<91)/*对大写进行解密*/{n=(n-65-k)%26;if(n<0)n=26+n;l=(char)(n+97);printf("%c",l);}}str1[i]='\0';getch();return 0;}4.1.4 运行结果4.2 置换密码4.2.1根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作。
4.2.2置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。
4.2.3代码#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];clrscr();/*----------------------------*/printf("This is a substitution cipher...\n");printf("Please input the M::\n");/*输入明文M*/gets(M);printf("Please input the K::\n");/*输入密钥K*/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]);}}getch();return 0;}4.2.4运行结果5.总结通过此次实验,对古典密码算法有了进一步的了解,同时也在过程当中学习到了如何更好的完善一个问题的求解过程。
这次的实验还可以通过MATLAB来完成。
在置换密码的算法中,未能完成解密算法,但是我会继续完成的。