当前位置:首页 > RSA公钥加密算法及其安全性讨论
RSA公钥加密算法及其安全性讨论
RSA algorithm for public-key encryption and its security
摘要:RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。但是,RSA的安全性依赖于大数的因子分解,却并没有从理论上证明破译RSA的难度与大数分解难度等价,即RSA的重大缺陷是无法从理论上把握它的保密性能到底如何。随着计算能力的不断进步和各种攻击方法的出现,RSA算法是否真的安全。 关键词:RSA,公钥,加密,大数分解,攻击,安全性 1 RSA加密算法
1.1公钥简介 密码体制按密钥类型分为对称密钥和不对称密钥。对称密钥即加密、解密用的是同一个密钥,又称为私钥。不对称密钥即公钥加密,加密、解密用的是不同的密钥,一个密钥“公开”,即公钥,另一个自己秘密持有,即私钥,加密方用公钥加密,只有用私钥才能解密——史称公钥加密体系:PKI。
1.2 RSA算法简介 RSA加密算法是一种非对称加密算法。RSA加密算法是Ron Rivest、Adi Shamirh和Len Adleman于1977年在美国麻省理工学院开发出来的,次年首次对外公开宣布,是第一个既能用于数据加密也能用于数字签名的算法。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA是建立在“大整数的素因子分解是困难问题”基础上的,其安全性取决于大数分解,也就是大数分解质因数的困难性。换言之,对一极大整数做因式分解愈困难,RSA演算法愈可靠。假如有人找到一种快速因式分解的演算法的话,那么用RSA加密的信息的可靠性肯定会急剧下降,但找到这样的演算法的可能性是非常小的,今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。 1.3 RSA算法
1.3.1公钥和私钥的产生
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:
(1)选两个保密的足够大的素数p和q。同时对p, q严加保密,不让任何人知道。 (2)计算N=p×q。 (3)计算f(n)=(p-1)(q-1)。
(4)找一个与f(n)互质的数e,且1 (7)以{e,N}为公钥,{d,N}为私钥。 Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。 1.3.2 加密与解密消息 假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约 好的格式将m转换为一个小于N的整数n。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c: c≡ne (mod N) 计算c并不复杂。Bob算出c后就可以将它传递给Alice。 解密过程为计算:n≡cd(mod N)。得到n后,她可以将原来的信息m重新复原。 由算法可知:如果第三者进行窃听,他会得到n,N(p×q),e这几个数,如果想要解码,必须想办法得到d。要获得d,最简单的方法是将N分解为p和q,这样她可以得到同余方程d× e ≡ 1 (mod (p-1)(q-1))并解出d,然后代入解密公式 n≡c(mod N) 导出n(破密)。但至今为止还没有人找到一个多项式时间的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在。 2 RSA算法的安全性 2.1大数的分解问题 著名数学家费马(1601-1665)和勒让德(1752-1833)都研究过分解因子的算法,现代某些更好的算法是勒让德方法的扩展。其中R. Schroeppel算法是一类较好的算法,用此法分解因子仍然需要大约e 次运算, 其中ln表示自然对数,可见分解n所需的运算次数与密钥的长度有关,随着密钥长度的增加,分解所需的时间会成指数倍增加。 若用1台1s能进行1亿次因子分解的高速计算机来计算,分解十进制长度为200位的n,其所需时间为3 800 000年。由此可见,对于RSA系统,如果用一个长度为200位(十进制)的n,认为它是比较安全的。n的长度越长,因子分解越困难,密码就越难以破译,加密强度就越高。一般来说,每增加10位二进制数,分解的时间就要加长1倍。 不过随着计算机运算速度的提高和并行计算的发展,破解的速度也会同步提高,这时可能要求使用更长的密钥。1993年,一个国际研究小组决定对RSA-129发出挑战。他们之所以敢于这样做,主要因为近20年来,计算机运算速度有了突飞猛进的提高,在大数分解理论上也有新的突破。该小组在国际互联网上集合来自世界各地的志愿参加者,向他们分发因数分解软件。每个参加者都领取了不同的因数分解任务,在自己的计算机上独立运算,然后把计算结果寄回MIT总部,列表归纳。到1994年4月,共有600余名志愿者参加了这项破译活动。他们总共动用了1600多台工作站、大型机和超级计算机,花费了8个月的时间,终于分解了RSA-129的公开钥匙。不过破解的难度随着n长度而不断增加,因此可以根据被加密文件的重要程度及对加密时间的要求这两个因素来选择n的长度,密钥长度决定保密的等级。到目前为止,世界上还没有任何可靠的攻击RSA演算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。 1994年彼得·秀尔(Peter Shor)证明一台量子计算机可以在多项式时间内进行因数分解。它利用量子计算的并行性,可以快速分解出大数的质因子。假如有人能够找到一种有效的分解大整数的算法的话,或者假如量子计算机可行的话,那么大数分解将不再是难题。基于大数分解的加密算法将不再安全,包括RSA在内。 2.2已公开的或已知的攻击方法 2.2.1 RSA共模攻击 若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最 d 普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那么该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则: C1 = P^e1 mod n C2 = P^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) * C2^s = P mod n 另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无需分解模数。解决办法只有一个,那就是不要共享模数n。 2.2.2 RSA的选择密文攻击 RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装( Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构: ( XM )^d = X^d *M^d mod n 前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way HashFunction 对文档作HASH处理,或同时使用不同的签名算法。 2.2.3大数因数分解法 针对RSA最流行的攻击一般是基于大数因数分解。大数分解问题在上文已作阐述,1999年,RSA-155(512 bits)被成功分解,花了五个月时间(约8000 MIPS 年)这里列举一些实例。 和224 CPU hours 在一台有3.2G中央内存的Cray C916计算机上完成 。2002年,RSA-158也被成功因数分解。 2009年12月12日,编号为 RSA-768 (768 bits, 232 digits)数也被成功分解。 2.2.4误用导致的安全性问题 RSA的小指数攻击。 有一种提高 RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。e = 2永远不应该被使用。 找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q-1的因子不能太小,否则的话N也可以被很快地分解。1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而d < N1/4/3,那么从N和e可以很有效地推算出d。因此密钥d必须足够大。 RSA的攻击攻击方法很多,如旁道攻击法,部分密钥暴露攻击法,RSA使用不当的其他攻击法等。 2.3 RSA 加密算法的缺点 1)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。 2) RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度 与大数分解难度等价。且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。 3) 至今为止没有人能够证明对N进行因数分解是唯一的从c导出n的方法。若4)北京时间2月15日上午消息,据《纽约时报》周二报道,欧美数学家和密码有或发现其他简单的方法的话,RSA算法将会被攻破。 学家偶然发现,目前被全世界广泛应用的公钥加密算法RSA存在漏洞。他们发现,在700万个实验样本中有2.7万个公钥并不是按理论随机产生的。也就是说,或许有人可以找出产生公钥的秘密质数。 5)RSA密钥长度随着保密级别提高,增加很快。 总结:RSA的安全性依赖于大数的因子分解难题,从提出到现在的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。虽然并没有人证明RSA的难度与大数分解难度等价,也没有人证明对N进行因数分解是唯一的从c导出n的方法。但迄今为止,也没有一个好的攻击RSA算法的方法,RSA密码同样很少被破译。随着计算能力的增长,以及分解方法的改进,大数分解问题,可能将越来越容易。但同时增加大数的位数可以增加分解的难度。RSA的缺点和误用,只要合理的避开和防范就可以很好地避免。因此,虽然RSA算法存在着这样那样的被破解的可能性,但就现今的计算能力和水平,只要选择合适的长度,RSA算法即密码体制还是很安全的。 参考文献: 【1】 现代密码学.杨波编著.——北京:清华大学出版社,2003 【2】 RSA算法——http://baike.http://www.china-audit.com//view/7520.htm 【3】 RSA加密算法—— http://zh.wikipedia.org/wiki/RSA????ˉ?????% 【4】 AE??3? 量子分解算法——http://baike.http://www.china-audit.com//view/1347838.htm#sub1347838 【5】 经典密码学与现代密码学.(美)Richard Spillman著.叶元建.曹英.张长富译. ——北京:清华大学出版社.2005.7
共分享92篇相关文档