文档库 最新最全的文档下载
当前位置:文档库 › Simple-RSA算法_实验报告

Simple-RSA算法_实验报告

北京林业大学

2014 学年—2015 学年第2 学期计算机网络安全

实验任务书

专业:计算机科学与技术班级:_计算机班______

姓名:学号:__________

实验地点:N901 任课教师:

实验题目:Simple-RSA算法

实验环境:Windows 操作系统,VC开发环境,C/C++语言

实验要求:

阅读RSA算法,巩固对RSA公钥加解密算法原理的理解。学习和掌握生成质数的一般性方法,用于产生RSA算法秘钥。

1.编程计算所有小于200的质数,输出文件到primer.txt。

2.编程实现大整数指数求余的函数Power_Mod(B,i,n)=B i mod n。

3.选择p为小于100的最大质数、q为大于100的最小质数,计算RSA算法的公钥(e,n)和私钥(d,n)。

4.基于公钥(e,n)和私钥(d,n),以及Power_Mod计算明文M=52的密文C,并计算密文C的明文M,验证算法的正确性。0

5.尝试一个更大的M(但不要超过n),计算密文C;利用解密公式反求解M,体会计算过程与结果的差异。

实验内容:

1.算法简介

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。

今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。

RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

正是基于这种理论,RSA算法通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA 密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

2.素数的计算与判别

素数的定义是:一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除。换句话说就是该数除了1和它本身以外不再有其他的因数;否则,称为合数。根据这一原则,最小的素数是2,它也是唯一的偶素数。再往后是3,5,7,11,13,17,19等等。

要判别一个数q是否是素数其实就是看他能不能被其他大于1的自然数整除:如果不存在这样的自然数,那么q就是素数;否则q就是合数。对于一个给定的整数,一个简单的方法是用它去除以所有比它小的整数,如果都不能整除,那么就是素数,否则就是合数。

但是使用这种方法的效率往往较低,可以从两个角度进行改进。第一,由于合数是两个或两个以上素数的乘积,只要一个数能够被一个小于它素数整除,那么这个数字的倍数都是合数。这样,对于一个给定的数字,我们只要看它能否整除小于它的素数就可以判别该数字的类型了。

第二个方面,2,3,5,11等素数都有较为容易的判别准则,可以尝试利用这些准则进行筛选备选素数。例如,所有的偶数都不用进行尝试了,或者所有末尾是5的数字也不需要尝试。给出你的想法和实现。

3.余数的性质

余数的定义:如果整数a=c*n+r(0=

对于两个整数a=c1*n+r1和b=c2*n+r2(0=

1)(a+b) mod n =[(c1+c2)*n+(r1+r2)] mod n=(r1+r2) mod n

2)(a*b) mod n =[(c1*c2*n+c1*r2+c2*r1)*n+r1*r2] mod n

=(r1*r2) mod n

利用这两条性质,我们就可以利用余数r1和r2四则运算的结果对n求余数,从而实现对原始整数a,b四则运算的求余数。

4.幂指数余数的简化计算

对于B i,当B或者i非常大的时候,整数B i 的数值会非常大,很容易就会出现超出计算机的存储范围。但是如果我们求解的是幂指数B i 的余数时,就可以利用余数的性质进行简化。

如果B>M并且B=c*M+r(0<=r

如果B

B i+2 mod M=[(B i mod M)*r] mod M。

5.参考教材生成RSA算法秘钥对,利用公钥加密、私钥解密(详见教材)。

实验报告要求:

1.预习报告

a)请用文字说明判别一个数是否是质数的判别方法。如何有效的加快素数的寻找办法?是否能利用已知的小素数判断更大的素数?

答:判别质数:

1)第一补求得改质数的平方根

2)用质数从2开始取余,求得余数为0,则这个数不为质数。

3)直到被除数大于该数的平方根时,则这个数为质数。

加快质数的寻找方法,大于2的奇数中寻找。

不能利用已知的小素数判断更大的素数。

b)给定三个整数B,n,i,如果B>n,在计算B i mod n时,如何避免产生一个较大的整数B i?

答:

避免产生一个较大的整数,减小i or 若B能够整除n则先整除n 之后再计算。。

c)给定三个整数B,n,i,如果B

答:

减小B的值。

d)对于选定的素数p和q,给出求解公钥(e,n)和私钥(d,n)的求解方法和步骤。

答:

1)n = p * q;

2) f(n) = (p-1) * (q-1);

3) 求解1

4) e * d = 1 mod f(n);求解得到d;

e)基于Power_Mod(B,i,n)和给定的公钥(e,n)和私钥(d,n),给出

对M加密/对C解密的计算函数。

答:

C = M^e mod n;

M = C^d mod n;

2.实验总结

a)给出本实验中每一个函数的完整声明,并说明这些函数的功能是什么。

答:

void primer_200();//求200以内的所有素数。

int Power_Mod(int B,int i,int n);//大整数求余。

void public_private(int p,int q);//计算公钥私钥。

void mingwen_miwen(int M);//计算密文以及验证密文

void big_mingwen(int M);//尝试计算一个大整数明文的密文

b)写出200以内的所有质数。

答:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61

67 71 73 79 83 89 97 101 103 107 109 113

127 131 137 139 149 151 157 163 167

173 179 181 191 193 197 199

c)你是如何计算Power_Mod(B,i,n)=B i mod n的?有没有采用一定的方法避免过大B i的产生?

答:

没有,没有想到这样的实际可行的办法。

d)对于加解密的时间,你有什么直观的体会?

答:

当公钥很大时,或者是明文比较大时出现计算时间明显增大,需要的时间比较长。

相关文档