RSA算法公钥加密算法new_第1页
RSA算法公钥加密算法new_第2页
RSA算法公钥加密算法new_第3页
RSA算法公钥加密算法new_第4页
RSA算法公钥加密算法new_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RSA1978年,MIT的Rivest、Shamir、Adleman提出RSA算法KA、E和D公开非对称加密(公开密钥加密)密码学的一次革命,定义:KA、E和D公开基于数论原理(大数分解难题)是目前应用最广泛的公钥加密算法属于块加密算法在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler'stotientfunction、@函数、欧拉商数等。RSA算法原理l定义:RSA加密算法确定密钥:1.找到两个大质数,p,q2.3.4.Letn=pqletm=(p-1)(q-1);Chooseeanddsuchthatde=1(%m).2.3.4.Publishnandeaspublickey.Keepdandnassecretkey.加密:C=MAe(%n)解密:M=(CAd)%n其中C=MAe(%n)为C%n=(MAe)%n存在的主要问题是大数计算和大数存储的问题。什么是RSARSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n至少也要600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(SecureElectronicTransaction协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:RonRivest,AdiShamir和LeonardAdleman。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n及e1),(n及e2)就是密钥对。RSA加解密的算法完全相同,设A为明文,B为密文,则:A=BAe1modn;B=AAe2modn;e1和e2可以互换使用,即:A=BAe2modn;B=AAe1modn;一、RSA的安全性RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。二、RSA的速度由于进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。三、RSA的选择密文攻击RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装(Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:(XM)Ad=XAd*MAdmodn前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-WayHashFunction对文档作HASH处理,或四、RSA的公共模数攻击若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥为el和e2,公共模数是n,贝。:Cl=PAelmodnC2=PAe2modn密码分析者知道n、el、e2、Cl和C2,就能得到P。因为el和e2互质,故用Euclidean算法能找到r和s,满足:r*el+s*e2=l假设r为负数,需再用Euclidean算法计算ClA(-l),则(ClA(-l))A(-r)*C2As=Pmodn另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e‘和d,,而无需分解模数。解决办法只有一个,那就是不要共享模数n。RSA的小指数攻击。有一种提高RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n至少也要600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(SecureElectronicTransaction协议中要求CA采用比特长的密钥,其他实体使用比特的密钥。在许多应用领域,公钥密码技术在保障安全方面起了关键的作用在某些场合由于不便频繁更换私人密钥如权威机构的证书密钥、金融机构的签名密钥等,确保密钥的安全就至关重要防止密钥泄露的一项决定性措施是采用门限密码技术,,它将一部分密码的功能分散给多人,而只有一定数量的成员合作方可完成密码运算另外,在一些特殊场合也须谨防密钥的持有者权力过于集中而滥用职权,这也要求对密钥进行分散管理,以克服权力过于集中的弊端实现密钥分散管理的门限密码,需要解决秘密的分享、密码算法以及结合这两者而设计出新的加密方式密码算法的研究一直是密码理论的主体,目前已有许多算法可供选择使甩对秘密分享也早有雌,它是指将系统的秘密s,分解为N个部分秘密s1,s2,s3…,sn,系统的N个成员P1,P2,..Pn分别拥有各自的部分秘密,使得任何少于T个成员都无法从他们的部分秘密得到任何关于系统秘密s信息;借助有效的算法,任意T成员可从相应的部分秘密得到系统的秘密s.这就是所谓的,(T,N)一门限秘密分享系统在实际应用中,秘密分享系统存在着不可回避的问题,即由谁来完成从部分秘密恢复系统秘密的工作因为不论是谁,他一旦得到了个部分秘密,就可导出系统的秘密而独享,除非秘密的恢复是由一个可信的“黑盒子”完成,为了避免系统秘密的泄露,文献2提出利用部分密钥将加密的部分结果发给指定的人或机器,再由部分结果产生最终的结果,而又不暴露系统的秘密目前,门限密码已成为密码学中非常活跃的领域.RSA算法(转)2008-06-0510:39<一>基础RSA算法非常简单,概述如下:找两素数p和q取n=p*q取t=(p-1)*(q-1)取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1)取d*e%t==1这样最终得到三个数:nde设消息为数M(M<n)设c=(M**d)%n就得到了加密后的消息c设m=(c**e)%n则m==M,从而完成对c的解密。注:**表示次方,上面两式中的d和e可以互换。在对称加密中:nd两个数构成公钥,可以告诉别人;ne两个数构成私钥,e自己保留,不让任何人知道。给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解从而在已知nd的情况下无法获得e;同样在已知ne的情况下无法求得d。<二>实践接下来我们来一个实践,看看实际的操作:找两个素数:p=47q=59这样n=p*q=2773t=(p-1)*(q-1)=2668取e=63,满足e<t并且e和t互素用perl简单穷举可以获得满主e*d%t==1的数d:C:\Temp>perl-e"foreach$i(1..9999){print($i),lastif$i*63%2668==1}847即d=847最终我们获得关键的n=2773d=847e=63取消息M=244我们看看加密:c=M**d%n=244**847%2773用perl的大数计算来算一下:C:\Temp>perl-Mbigint-e"print244**847%2773”465即用d对M加密后获得加密信息c=465解密:我们可以用e来对加密后的c进行解密,还原M:m=c**e%n=465**63%2773:C:\Temp>perl-Mbigint-e"print465**63%2773”244即用e对c解密后获得m=244,该值和原始信息M相等。<三>字符串加密把上面的过程集成一下我们就能实现一个对字符串加密解密的示例了。每次取字符串中的一个字符的ascii值作为M进行计算,其输出为加密后16进制的数的字符串形式,按3字节表示,如01F代码如下:#!/usr/bin/perl-w#RSA计算过程学习程序编写的测试程序#watercloud2003-8-12#usestrict;useMath::BigInt;my%RSA_CORE=(n=>2773,e=>63,d=>847);#p=47,q=59my$N=newMath::BigInt($RSA_CORE{n});my$E=newMath::BigInt($RSA_CORE{e});my$D=newMath::BigInt($RSA_CORE{d});print"N=$ND=$DE=$E\n";subRSA_ENCRYPT(my$r_mess=shift@_;my($c,$i,$M,$C,$cmess);for($i=0;$i<length($$r_mess);$i++)($c=ord(substr($$r_mess,$i,1));$M=Math::BigInt->new($c);$C=$M->copy();$C->bmodpow($D,$N);$c=sprintf"%03X”,$C;$cmess.=$c;)return\$cmess;)subRSA_DECRYPT(my$r_mess=shift@_;my($c,$i,$M,$C,$dmess);for($i=0;$i<length($$r_mess);$i+=3)($c=substr($$r_mess,$i,3);$c=hex($c);$M=Math::BigInt->new($c);$C=$M->copy();$C->bmodpow($E,$N);$c=chr($C);$dmess.=$c;)return\$dmess;my$mess="RSA娃哈哈哈〜〜〜〃;$mess=$ARGV[0]if@ARGV>=1;print”原始串:〃,$mess,"\n”;my$r_cmess=RSA_ENCRYPT(\$mess);print〃加密串:“,$$r_cmess,"\n";my$r_dmess=RSA_DECRYPT($r_cmess);print〃解密串:“,$$r_dmess,"\n";#EOF测试一下:C:\Temp>perlrsa-test.plN=2773D=847E=63原始串:RSA娃哈哈哈加密串:5CB6CD6BC58A7709470AA74A0AA74A0AA74A6C70A46C70A46C70A4解密串:RSA娃哈哈哈C:\Temp>perlrsa-test.pl安全焦点(xfocus)N=2773D=847E=63原始串:安全焦点(xfocus)加密串:3393EC12F0A466E0AA9510D025D7BA0712DC3379F47D51C325D67B解密串:安全焦点(xfocus)<四>提高前面已经提到,rsa的安全来源于n足够大,我们测试中使用的n是非常小的,根本不能保障安全性,我们可以通过RSAKit、RSATool之类的工具获得足够大的N及DE。通过工具,我们获得1024位的N及DE来测试一下:n=0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2BC511951d=0x10001e=0xE760A3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B1965设原始信息M=0x11111111111122222222222233333333333完成这么大数字的计算依赖于大数运算库,用perl来运算非常简单:A)用d对M进行加密如下:c=M**d%n:C:\Temp>perl-Mbigint-e"$x=Math::BigInt->bmodpow(0x11111111111122222222222233333333333,0x10001,0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2BC511951);print$x->as_hex"0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898即用d对M加密后信息为:c=0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898B)用e对c进行解密如下:m=c**e%n:C:\Temp>perl-Mbigint-e"$x=Math::BigInt->bmodpow(0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898,0xE760A3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B1965,0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2BC511951);print$x->as_hex"0x11111111111122222222222233333333333(我的P41.6G的机器上计算了约5秒钟)得到用e解密后的m=0x11111111111122222222222233333333333==MC)RSA通常的实现RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA来对所有的信息进行加密,最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用RSA对刚才的加密密钥进行加密。最后需要说明的是,当前小于1024位的N已经被证明是不安全的自己使用中不要使用小于1024位的RSA,最好使用2048位的RSA算法的数学原理:先来找出三个数,p,q,r,其中p,q是两个相异的质数,r是与(p-1)(q-1)互质的数。p,q,r这三个数便是privatekey。接著,找出m,使得rm==1mod(p-1)(q-1)..…这个m一定存在,因为r与(p-1)(q-1)互质,用辗转相除法就可以得到了..…再来,计算n=pq.……m,n这两个数便是publickey。编码过程是,若资料为a,将其看成是一个大整数,假设a<n.…如果a>=n的话,就将a表成s进位(s<=n,通常取s=2N),则每一位数均小於n,然彳爰分段编码……接下来,计算b==a^mmodn,(0<=b<n),b就是编码彳爰的资料……解码的过程是,计算c==bArmodpq(0<=c<pq),於是乎,解码完毕……等会会证明c和a其实是相等的:)如果第三者进行窃听时,他会得到几个数:m,n(=pq),b……他如果要解码的话,必须想办法得到r……所以,他必须先对n作质因数分解………要防止他

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论