1、RSA1978 年, MIT 的 Rivest、Shamir、Adleman 提出 RSA 算法非对称加密(公开密钥加密)密码学的一次革命,定义: KA KB , KA、E 和 D 公开特点:基于数论原理(大数分解难题 ) 是目前应用最广泛的公钥加密算法 属于块加密算法 在数论,对正整数 n,欧拉函数是少于或等于 n 的数中与 n 互质的数的数目。此函数以其首名研究者欧拉命名,它又称为 Eulers totient function、 函数、欧拉商数等。RSA 算法原理l 定义:RSA 加密算法确定密钥:1. 找到两个大质数,p,q2. Let n=pq3. let m=(p-1)(q-1);
2、Choose e and d such that de=1(%m).4. Publish n and e as public key. Keep d and n as secret key.加密:C=Me(%n)解密:M=(Cd)%n其中 C=Me(%n) 为 C%n=(Me)%n存在的主要问题是大数计算和大数存储的问题。什么是 RSARSA 算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA 是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA 的安全性依赖于大数的因子分解,但并没有从理论上证明
3、破译 RSA 的难度与大数分解难度等价。即 RSA 的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是 NPC 问题。RSA 的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。 B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求 CA 采用 2048 比特长的密钥,其他实体使用1024 比特的密钥。这种
4、算法 1978 年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和 Leonard Adleman。RSA 算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA 的算法涉及三个参数,n、e1、e2 。 其中,n 是两个大质数 p、q 的积,n 的二进制表示时所占用的位数,就是所谓的密钥长度。 e1 和 e2 是一对相关的值,e1 可以任意取,但要求 e1 与(p-1)*(q-1)互质;再选择 e2,要求(e2*e1)m
5、od(p-1)*(q-1)=1。 (n 及 e1),(n 及 e2)就是密钥对。 RSA 加解密的算法完全相同,设 A 为明文,B 为密文,则:A=Be1 mod n;B=Ae2 mod n; e1 和 e2 可以互换使用,即: A=Be2 mod n;B=Ae1 mod n; 一、RSA 的安全性RSA 的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解 RSA 就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解 n 是最显然的攻击方法。现在,人们已能
6、分解多个十进制位的大素数。因此,模数 n 必须选大一些,因具体适用情况而定。二、RSA 的速度由于进行的都是大数计算,使得 RSA 最快的情况也比 DES 慢上倍,无论是软件还是硬件实现。速度一直是 RSA 的缺陷。一般来说只用于少量数据加密。三、RSA 的选择密文攻击RSA 在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装( Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构: ( XM )d = Xd *Md mod n前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征
7、-每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用 One-Way HashFunction 对文档作 HASH 处理,或四、RSA 的公共模数攻击若系统中共有一个模数,只是不同的人拥有不同的 e 和 d,系统将是危险的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。设 P 为信息明文,两个加密密钥为 e1 和 e2,公共模数是 n,则:C1 = Pe1 mod nC2 = P
8、e2 mod n密码分析者知道 n、e1、e2、C1 和 C2,就能得到 P。因为 e1 和 e2 互质,故用 Euclidean 算法能找到 r 和 s,满足 :r * e1 + s * e2 = 1假设 r 为负数,需再用 Euclidean 算法计算 C1(-1),则( C1(-1) )(-r) * C2s = P mod n另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对 e 和 d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的 e和 d,而无需分解模数。解决办法只有一个,那就是不要共享模数 n。RSA 的小指数攻击。 有一种提高 RSA 速度的建议
9、是使公钥 e 取较小的值,这样会使加密变得易于实现,速度有所提高。但这样作是不安全的,对付办法就是 e 和 d 都取较大的值。RSA 算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA 是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA 的安全性依赖于大数的因子分解,但并没有从理论上证明破译 RSA的难度与大数分解难度等价。即 RSA 的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是 NPC 问题。 RSA 的缺点主要有: A)产生密钥很麻烦,受到素数产生技术
10、的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET( Secure Electronic Transaction )协议中要求CA 采用比特长的密钥,其他实体使用比特的密钥。在许多应用领域, 公钥密码技术在保障安全方面起了关键的作用在某些场合由于不便频繁更换私人密钥如权威机构的证书密钥、金融机构的签名密钥等, 确保密钥的安全就至关重要防止密钥泄露的一项决定性措施是采用门限密码技术, , 它将一部分密码的功能
11、分散给多人, 而只有一定数量的成员合作方可完成密码运算另外, 在一些特殊场合也须谨防密钥的持有者权力过于集中而滥用职权, 这也要求对密钥进行分散管理, 以克服权力过于集中的弊端实现密钥分散管理的门限密码, 需要解决秘密的分享、密码算法以及结合这两者而设计出新的加密方式密码算法的研究一直是密码理论的主体, 目前已有许多算法可供选择使甩对秘密分享也早有雌, 它是指将系统的秘密s, 分解为N个部分秘密s1,s2,s3,sn, 系统的N个成员P1,P2,.Pn分别拥有各自的部分秘密, 使得任何少于T个成员都无法从他们的部分秘密得到任何关于系统秘密s信息;借助有效的算法, 任意T成员可从相应的部分秘密得
12、到系统的秘密s.这就是所谓的, (T,N)一门限秘密分享系统在实际应用中,秘密分享系统存在着不可回避的问题, 即由谁来完成从部分秘密恢复系统秘密的工作因为不论是谁, 他一旦得到了个部分秘密, 就可导出系统的秘密而独享, 除非秘密的恢复是由一个可信的“ 黑盒子”完成 , 为了避免系 统秘密的泄露, 文献2提出利用部分密钥将加密的部分结果发给指定的人或机器, 再由部分结果产生最终的结果, 而又不暴露系统的秘密目前, 门限密码已成为密码学中非常活跃的领域.RSA 算法(转)2008-06-05 10:39基础RSA 算法非常简单,概述如下:找两素数 p 和 q取 n=p*q取 t=(p-1)*(q-
13、1)取任何一个数 e,要求满足 e实践接下来我们来一个实践,看看实际的操作:找两个素数:p=47q=59这样n=p*q=2773t=(p-1)*(q-1)=2668取 e=63,满足 eperl -e “foreach $i (1.9999) print($i),last if $i*63%2668=1 “847即 d847最终我们获得关键的n=2773d=847e=63取消息 M=244 我们看看加密:c=M*d%n = 244*847%2773用 perl 的大数计算来算一下:C:Tempperl -Mbigint -e “print 244*847%2773“465即用 d对 M 加密后
14、获得加密信息 c465解密:我们可以用 e 来对加密后的 c进行解密,还原 M:m=c*e%n=465*63%2773 :C:Tempperl -Mbigint -e “print 465*63%2773“244即用 e对 c 解密后获得 m=244 , 该值和原始信息 M 相等。字符串加密把上面的过程集成一下我们就能实现一个对字符串加密解密的示例了。每次取字符串中的一个字符的 ascii值作为 M进行计算,其输出为加密后 16进制的数的字符串形式,按 3 字节表示,如 01F代码如下:#!/usr/bin/perl -w#RSA 计算过程学习程序编写的测试程序#watercloud 2003
15、-8-12#use strict;use Math:BigInt;my %RSA_CORE = (n=2773,e=63,d=847); #p=47,q=59my $N=new Math:BigInt($RSA_COREn);my $E=new Math:BigInt($RSA_COREe);my $D=new Math:BigInt($RSA_COREd);print “N=$N D=$D E=$En“;sub RSA_ENCRYPT my $r_mess = shift _;my ($c,$i,$M,$C,$cmess);for($i=0;$i new($c);$C=$M-copy();
16、$C-bmodpow($D,$N);$c=sprintf “%03X“,$C;$cmess.=$c;return $cmess;sub RSA_DECRYPT my $r_mess = shift _;my ($c,$i,$M,$C,$dmess);for($i=0;$i new($c);$C=$M-copy(); $C-bmodpow($E,$N);$c=chr($C);$dmess.=$c;return $dmess;my $mess=“RSA 娃哈哈哈“;$mess=$ARGV0 if ARGV = 1;print “原始串:“,$mess,“n“;my $r_cmess = RSA_E
17、NCRYPT($mess);print “加密串:“,$r_cmess,“n“;my $r_dmess = RSA_DECRYPT($r_cmess);print “解密串:“,$r_dmess,“n“;#EOF测试一下:C:Tempperl rsa-test.plN=2773 D=847 E=63原始串:RSA 娃哈哈哈加密串:5CB6CD6BC58A7709470AA74A0AA74A0AA74A6C70A46C70A46C70A4解密串:RSA 娃哈哈哈C:Tempperl rsa-test.pl 安全焦点(xfocus)N=2773 D=847 E=63原始串:安全焦点(xfocus)
18、加密串:3393EC12F0A466E0AA9510D025D7BA0712DC3379F47D51C325D67B解密串:安全焦点(xfocus)提高前面已经提到,rsa 的安全来源于 n 足够大,我 们测试中使用的 n 是非常小的,根本不能保障安全性,我们可以通过 RSAKit、RSATool 之类的工具获得足够大的 N 及 D E。通过工具,我们获得 1024 位的 N 及 D E 来测试一下:n=0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005DBDCDED9BDFCB3C
19、4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2BC511951d=0x10001e=0xE760A3804ACDE1E8E3D7DC0197F9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D86B36E943080E4919CA8CE08718C3B0930867A98
20、F635EB9EA9200B25906D91B80A47B77324E66AFF2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B1965设原始信息M=0x11111111111122222222222233333333333完成这么大数字的计算依赖于大数运算库,用 perl 来运算非常简单:A) 用 d对 M进行加密如下:c=M*d%n :C:Tempperl -Mbigint -e “ $x=Math:BigInt-bmodpow(0x11111111111122222
21、222222233333333333, 0x10001, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2BC511951);print $x-as
22、_hex“0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898即用 d对 M 加密后信息为:c=0x17b287be418c69ecd7
23、c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898B) 用 e对 c进行解密如下:m=c*e%n :C:Tempperl -Mbigint -e “ $x=Math:BigI
24、nt-bmodpow(0x17b287be418c69ecd7c39227ab681ac422fcc84bb35d8a632543b304de288a8d4434b73d2576bd45692b007f3a2f7c5f5aa1d99ef3866af26a8e876712ed1d4cc4b293e26bc0a1dc67e247715caa6b3028f9461a3b1533ec0cb476441465f10d8ad47452a12db0601c5e8beda686dd96d2acd59ea89b91f1834580c3f6d90898, 0xE760A3804ACDE1E8E3D7DC0197F
25、9CEF6282EF552E8CEBBB7434B01CB19A9D87A3106DD28C523C29954C5D86B36E943080E4919CA8CE08718C3B0930867A98F635EB9EA9200B25906D91B80A47B77324E66AFF2C4D70D8B1C69C50A9D8B4B7A3C9EE05FFF3A16AFC023731D80634763DA1DCABE9861A4789BD782A592D2B1965, 0x328C74784DF31119C526D18098EBEBB943B0032B599CEE13CC2BCE7B5FCD15F90B66
26、EC3A85F5005DBDCDED9BDFCB3C4C265AF164AD55884D8278F791C7A6BFDAD55EDBC4F017F9CCF1538D4C2013433B383B47D80EC74B51276CA05B5D6346B9EE5AD2D7BE7ABFB36E37108DD60438941D2ED173CCA50E114705D7E2BC511951);print $x-as_hex“0x11111111111122222222222233333333333(我的 P4 1.6G 的机器上计算了约 5 秒钟)得到用 e 解密后的 m=0x11111111111122222222222233333333333 = M