《网络信息安全》实验报告姓名陈申鹏学号 ********** 专业信息管理与信息系统班级 14信管指导教师实验一传统密码算法一、实验目的及任务通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
二、实验环境运行Windows操作系统的PC机,具有C语言编译环境。
三、实验原理古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密.它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密.下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象.1. 替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。
例如:明文字母a,b,c,d ,用D,E,F,G做对应替换后形成密文.替代密码包括多种类型,如单表替代密码,多明码替代密码,多字母替代密码,多表替代密码。
下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环移位密码。
它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。
它的加密过程可以表示为下面的函数:E(m)=(m+k) mod n其中:m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数.例如:对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L:E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L2. 置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。
置换密码有时又称为换位密码.矩阵换位法是实现置换密码的一种常用方法。
它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。
例如,明文为attack begins at five,密钥为cipher,将明文按照每行6列的形式排在矩阵中,形成如下形式:a t t a c kb e g i n sa t f i v e根据密钥cipher中各字母在字母表中出现的先后顺序,给定一个置换:1 2 3 4 5 6F= 11 4 5 32 6根据上面的置换,将原有矩阵中的字母按照第1列,第4列,第5列,第3列,第2列,第6列的顺序排列,则有下面形式:a a c t t kb i n g e sa i v f t e从而得到密文:abatgftetcnvaiikse其解密的过程是根据密钥的字母数作为列数,将密文按照列,行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文.四、实验步骤(1)根据实验原理部分对替代密码算法的介绍,自己创建明文信息,并选择一个密钥k,编写替代密码算法的实现程序,实现加密和解密操作.(2)根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,编写置换密码算法的实现程序,实现加密和解密操作.五、实验结果实验结果截图六、实验思考题1:替代密码的原理是什么?2:置换密码的原理是什么?七、程序源代码#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];printf("......this is a procedure....\n");printf("please input a word(M):");gets(str1);printf("please input the secret key(K):");scanf("%d",&k);m=strlen(str1);printf("the lengh is %d\n",m);printf("\n*\n*\n***\n*\n*\n");printf("secret(C) is :");for(i=0;i<m;i++){n=(int)str1[i];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 lengh is %d",strlen(str2));printf("\n\n*\n*\n***\n*\n*\n");printf("when the secret is '%s',\nword is......:\n",str2); printf("\n");m=strlen(str2);for(i=0;i<m;i++){n=(int)str2[i];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';return 0;}实验二RSA加解密算法的实现一、实验目的及任务:掌握RSA加密算法的加解密过程。
二、实验环境VC或TC编程环境;主机操作系统为Windows2000或Windows XP。
三、实验原理RSA加密算法是一种非对称加密算法。
在公钥加密标准和电子商业中RSA被广泛使用。
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔、(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。
当时他们三人都在麻省理工学院工作。
RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法的可靠性基于分解极大的整数是很困难的。
假如有人找到一种很快的分解因子的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。
但找到这样的算法的可能性是非常小的。
今天只有短的RSA钥匙才可能被强力方式解破。
到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。
只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
1、公钥和私钥的产生假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。
她可以用以下的方式来产生一个公钥和一个密钥:➢随意选择两个大的质数p和q,p不等于q,计算N=p*q。
➢根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)➢选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)➢用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))➢将p和q的记录销毁。
e是公钥,d是私钥。
d是秘密的,而N是公众都知道的。
Alice将她的公钥传给Bob,而将她的私钥藏起来。
2、加密消息假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。
他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。
假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。
他可以将n加密为c:计算c并不复杂。
Bob算出c后就可以将它传递给Alice。
3、解密消息Alice得到Bob的消息c后就可以利用她的密钥d来解码。
她可以将c转换为n,得到n后,她可以将原来的信息m重新复原。
ed ≡ 1 (mod p-1)和ed ≡ 1 (mod q-1)。
(因为p和q是不同的质数)四、实验步骤1、求素数p和q2、求公钥(e,n):e与ψ(n) = (p-1)(q-1)互质3、求私钥(d,n):d× e ≡ 1 (mod (p-1)(q-1))4、加密过程:c=(Me)mod n5、解密过程:m=(Cd)mod n五、实验结果找两个素数 : p=43 q=59n=p*q=2537 ,t=(p-1)*(q-1)=2436寻找 e 满足 e<t 并且 e 和 t 互素,找到 e=13 ,寻找 d 使 e*d%t ==1 得到 d=9371:加密 m = 134,得C=2:解密C= ,得m=134实验结果截图:六、思考题RSA算法主要有哪几部分?七、RSA源程序(仅供参考)//RSA算法的C程序实现#include<stdio.h>int candp(int a,int b,int c)//数据处理函数,实现幂的取余运算{int r=1;b=b+1;while(b!=1){r=r*a;r=r%c;b--;}printf("%d\n",r);return r;}int fun(int x,int y)//公钥e与t的互素判断{int t;while(y){t=x;x=y;y=t%y;}if(x==1)return 0;//x与y互素时返回0elsereturn 1;//x与y不互素时返回1}void main(){intp,q,e,d,m,n,t,c,r;printf("请输入两个素数p,q:");scanf("%d%d",&p,&q);n=p*q;printf("计算得n为%3d\n",n);t=(p-1)*(q-1);//求n的欧拉数printf("计算得t为%3d\n",t);printf("请输入公钥e:");scanf("%d",&e);if(e<1||e>t||fun(e,t)){printf("e不合要求,请重新输入:");//e<1或e>t或e与t不互素时,重新输入scanf("%d",&e);}d=1;while(((e*d)%t)!=1)d++;//由公钥e求出私钥dprintf("经计算d为%d\n",d);printf("加密请输入1\n");//加密或解密选择printf("解密请输入2\n");scanf("%d",&r);switch(r){case 1:printf("请输入明文m:");//输入要加密的明文数字scanf("%d",&m);c=candp(m,e,n);printf("密文为%d\n",c);break;case 2:printf("请输入密文c:");//输入要解密的密文数字scanf("%d",&c);m=candp(c,d,n);printf("明文为%d\n",m);break;}}。