数学实验大质数基础上的RSA密码Word下载.docx
- 文档编号:19824693
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:10
- 大小:174.54KB
数学实验大质数基础上的RSA密码Word下载.docx
《数学实验大质数基础上的RSA密码Word下载.docx》由会员分享,可在线阅读,更多相关《数学实验大质数基础上的RSA密码Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
对称密码加密和解密所用的方法是对称的,密钥是相同的。
一套密码系统中,方法是固定的,可以有多种密钥。
对对称密码而言,知道了加密密钥,也就知道了解密密钥。
通信双方必须事先约定密钥,而在密钥的传输过程中又存在很大的不安全因素,有时约定密钥甚至是不可能的,如一个接收者想要接收许多人发送的信息,又不希望每个发送者看到别人发送的信息,如果使用对称密码,接收者只能与每个发送者都约定一组密钥,既麻烦也不安全,而对于公开招标的单位,不同公司间的投标信一定要相互保密,单位又不可能与所有公司约定密钥。
为解决这类问题,人类创造性地发明了公开密钥体制。
在公钥密码体制中,加密密钥和解密密钥分离,这样,一个具体用户就可以将自己设计的加密密钥和算法公诸于众,而只保密解密密钥。
任何人利用这个加密密钥和算法向该用户发送的加密信息,该用户均可以将之还原。
因为一组加密密钥和解密密钥对应的是同样的密文和明文,之间必然会有联系,以加密密钥为公钥,解密密钥为私钥,则根据公钥理论上可以推出私钥。
因此一套公钥密码体制的安全性关键就在于设计合理的加密算法使由公钥推出私钥极其困难。
许多公钥密码算法都是根据一些数学难题给出的。
综述:
我们这里所用的RSA公钥体制的安全就是基于大数分解的困难性。
RSA公钥体制现在被广泛使用,其基本思想是:
从两个超百位的大素数得到乘积相对简单,反之,给了这样一个乘积,将其分解为两个素因子则极端困难。
设
为一个正整数,将小于
且与之互素的正整数的个数记为
,称之为欧拉函数。
若
与
为两相异素数,
,则
。
而整数
互素,另一整数
满足
,则映射
是从
到自身的一一映射,其逆映射为
在RSA体制下,使用者选择一对相异素数
、
,计算
,再选择与
互素的
,然后选择一个整数
使
使用者将
公开作为公钥,将
作为私钥。
另一使用者向该使用者发送明文数字
,先加密得密文
,该使用者接收到
,解密得明文
,根据上述数学原理,
是相等的。
实际使用中,发送者需要将信息转化为数字,接收者需要将数字还原为数字,而信息与数字的对应表是公开的。
而对于信息的攻击者,只知公钥
,为破译密码,需要得知
,即必须求出
,最终归结为将大数分解
对于很大的
,分解工作量极大,这就保证了密码的安全性。
在RSA体系的模拟设计中,主要分为两大部分,即体系建立和系统使用。
体系建立需要生成加密解密所用参数,系统使用包括加密过程和解密过程。
实际编程中,需要根据MATLAB语言特点和机器状况来安排参数大小和操作过程。
大数基本运算:
首先要生成的参数就是两个大素数。
素数小了,在当今计算机的高速度运算面前密码体系将毫无安全性可言,而大数运算在电脑上并不能直接进行,因此首先要编写大数运算的程序,这也正是本实验有所创新的部分。
大数由于位数太多,选择用向量来存放,大数要实现5种基本运算,加、减、乘、除、模。
MATLAB中一个整数最多为11位,乘法有时会使位数加倍,故向量的一个元素所存的数最多可以是5位数,为合理利用计算机空间,在计算过程中节省时间,向量一个元素存放一个4位数,正常情况其中数字有0~9999共10000种可能,这样有一定冗余度,便于增加功能或进行修改,也容易翻译为C++或Java以进行别的应用。
一个向量设有100个元素,最多可以表示十进制下的400位数。
计算机内部的运算是在二进制基础上进行的,其运算过程对大数运算程序的设计很有启发性。
在大数运算程序中,加法是从低位到高位进行的,大数采用的是10000进制,减法求补再进行相加并不能使运算简单,因此采用从低到高相减的方法。
乘法要利用嵌套循环,每个循环均是从低位到高位,依次相乘,都加到结果向量的相应位置。
除法最复杂,计算机内部是从高到低,相减和移位,由于采用二进制,结果根据被除数和除数所在位置数的大小轻易得到,采用10000进制时,商难以确定,如果如果从1开始取值依次与除数相乘与被除数相应位置的数比较,将耗时巨大。
在实际编程中采用了将10000进制转换为二进制的办法。
因2^16>
10000,设一个有1600个元素的向量就足以容纳100个10000进制数了。
正常情况下这1600个元素都是0或1。
计算机内部移位是很快的操作,而在除法程序中移位必须强力移动,比较耗时。
最终商由二进制数还要转换为10000进制数。
同时,多次调用函数也会增加运算时间。
总的来看,除法运算是缓慢的。
求模运算与除法运算类似,不同的是除法结果记录了商,而求模结果记录了余数。
同样,模运算也是缓慢的。
进行下面的运算用了近4分钟。
文件add.m实现了加法运算,dec.m实现了减法运算,mul.m实现了乘法运算,div.m实现了除法运算,moda.m实现了求模运算。
除此之外,还有一些函数实现了一些使运算和编程方便的功能。
getn.m中y=getn(n)可得到一个最低位为n的10000进制数,dibytwo.m中y=dibytwo(been)可求出向量been的1/2。
y=digit(been)得到的是10000进制数的位数,y=digitbe(been)得到的则是二进制数的位数,它们可以通过记录无效的0的个数来避免无用的计算,尤其是在乘法、除法和求模运算中。
Y=cpabe(been,divto,a,c)可以比较二进制下被除数、除数对齐时从低位第a位到高位第c位的数的大小,为除法和求模服务,结果0表示小于,1表示大于,2表示相等,y=cpa(been,divto)则比较两个10000进制数的大小,结果为2表示大于,1表示相等,0表示小于,可广泛用于条件语句中。
is0.m检验10000进制数是否为0,is0be.m检验二进制数是否为0。
mod2.m得出的是大数模2后的结果,即最低位模2的结果。
MATLAB语言中“/”表示的是double型的除法,y=idiv(a,b)可给出整型除法a除以b的商。
bits.m把10000进制数变成二进制数,bytes.m把二进制变成10000进制,divbe.m计算二进制除法,modbe.m会给出二进制求模结果,bytesn.m、divben.m、modben.m都是为除法和模提供基础函数的,用途不是很广。
Isprime(n)检测数n是否为素数,函数利用了Robin-Miller测试法,当一个数比较大时,检测其是否为素数要用较长时间,10000进制数为2位时,大约要用30秒,这是由于多位大数计算过程复杂的缘故,也反映出程序代码还很不科学。
程序中,函数y=getprime(n)求得一个大于等于n的素数,当n增加时,运算更加复杂,而素数逐渐稀疏,寻找素数耗时较长。
实验中得到素数432125493617竟用了5个小时,进一步反映了利用向量分段存储的大数给运算带来的复杂性和程序的不成熟。
生成素数p、q后,可以计算n=p*q,记欧拉函数值E=(p-1)*(q-1),则e与E互素,即gcd(e,E)=1,确定e后,d须满足mod(e*d,E)=1,由此可求d。
由于运算速度慢,最终得到一个素数432125493617,另一个为31721,相乘得n=137********024857,欧拉函数值为137********499520,与之互素,e=3,求模逆得d=9138013771666347。
模幂函数为y=mol(x,a,n),得y=mod(x^a,n)采用了重复平方取模的算法,模逆函数为y=getk(x,n),得y=x^(-1)mod(n)。
至此,参数设置完毕。
因为公钥、私钥可以互换,要根据实际情况选择。
e、d比较,e很小,若以之作为私钥,解密相对容易,加密则比较困难,从安全角度来看,3太小了,一旦攻击者采用暴力破译,3首当其冲。
所以以(d,n)为私钥,(e,n)为公钥。
由于以大数作为密钥时,加密、解密都很慢,所以,在形成视图时,其下相关函数使用的密钥都是较小的数,以便于演示加解密过程
所用的算法:
1素性检测
给定一个正整数p,判断p是否是素数,称为素性检测。
RSA密码算法中p、q都是大素数(大于十进制100位)。
因此,素性检测是一个重要工具。
目前主要有概率测试法与确定性测试法,这里选用了广泛使用的概率测试法:
Robin-Miller测试法。
首先选择一个待测的随机数p,计算b,b是2整除p-1的次数,然后计算m,使p=1+2^b*m。
测试算法如下:
(1)选择随机数a<
p;
(2)设j=0且z=a
m
modp;
(3)如果z=1或z=p-1,那么p通过测试,可
能是素数;
(4)如果j>
0且z=1,那么p不是素数;
(5)设j=j+1,如果j<
b且z!
=p-1,设z=(z^2)modp,然后回到第(4)步。
如果z=p-1,那么p通过测试,可能是素数;
(6)如果j=b且z!
p-1,那么p不是素数。
数a被当成证据的概率为3/4。
这意味着当迭代次数为n时,它产生一个假的素数所花费的时间不超过(1/4)^n。
对大多数的随机数,几乎99.9%肯定a是证据。
2.RSA密码算法中的加密算法与解密算法都要进行大数的模幂运算(g^x)modn,因为g,x,n都是大数,不能直接采用先高次幂再求剩余的方法来处理,一般采用重复平方取模的算法、Montgomery算法和预处理的窗口法来加快运算速度。
实验中主要采用重复平方取模的算法来实现大数的模幂运算。
具体算法如下:
(1)a=g,b=x,c=1,转
(2);
(2)若b=0,则输出c,结束;
否则,转(3);
(3)若b(mod2)=0,转入(4);
否则,转(5);
(4)b=b/2,a=(a*a)mod(n),转(3);
(5)b=b-1,c=(a*c)mod(n),转
(2)。
加密过程与解密过程是相似的,加密时,首先要把计划传递的信息转化为数字,在这里即把string或char型转化为int型或double型
使用方法:
打开MATLAB系统,寻找文件jiami.fig,公钥和私钥在内部都已经设置好了。
在左侧栏中寻找:
或者点击画图标志:
新建或打开:
加密:
点击加密。
得到密文:
按下清空:
解密:
结果:
通过实验,可以发现,RSA的安全性在素数很大的时候是可以得到保证的。
要攻击这密码体系,比较直接的办法就是强力对素数积n进行分解,时间复杂度为
故n必须要大,取n为8位或10位,密码体系都很容易被攻破。
实验感想:
速度慢是RSA加密算法的一个缺点,首先,制造合适的密钥比较费时,其次,在得到密钥后,对明文进行加密比对称加密要慢。
假设计算机可容纳x位数的运算,由于加密和解密中的模幂运算过程中最大结果可能接近于n^2,故n只能取x/2位数,则质数取x/4位数比较合适。
在本实验中,最大的数只能是十进制400位的,故所求质数取100位为宜,而事实上,当超过9位10000进制的数做除法或模运算时,计算机要执行数分钟。
加密、解密时可避免除法运算,但模运算要大量出现,因此才会有5小时算一个12位素数的事。
除法运算中,将被除数、除数转换为二进制,将商转换为十进制会浪费大量时间。
现在思考整个问题时,会有改进算法的想法。
如直接用10000进制数相除,而用二分法试商,虽然试商要用时间,但略去了进制转换的过程。
与之相比,二进制的优点则是可以通过比直接判定商。
参考资料:
1)陈华,蔡光兴《基于Matlab/GUI的RSA密码演示系统》计算机与现代化2009(7)
2)刘卫国《Matlab程序设计与应用》2006
3)闫洪亮.牛军涛《实现RSA算法应注意的问题》计算机应用与软件2008(5)
4)胡卫群《Euclidean算法》南京农专学报1996(4)
5)雒海涛《MatlabGUI教程》2011
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数学 实验 质数 基础上 RSA 密码
![提示](https://static.bdocx.com/images/bang_tan.gif)