1. 引言
业界普遍认为不能选用e=3作为RSA公钥指数,就像说再也不能使用md5一样。一个密码算法在理论上被攻破,不是说在所有实践场景中就都有安全风险。比如,md5作为一种密码哈希函数,理论上它必须满足三个性质:(1) 输出的均匀分布性;(2) 抗碰撞攻击;(3) 抗原像攻击。当王小云发现了md5不满足性质(2)之后,理论上md5算法就被攻破——md5将从“密码哈希函数”的家族中退出。尽管如此,我们软件系统中若使用了md5,就真的不安全了吗?这要看情况!如果是在api签名中使用了hmac-md5,这并不会有什么问题;如果是保存用户登录密码或计算数字签名时用了md5,那么就存在一定的概率会导致安全性问题。
如果你所在组织有所谓的安全合规红线,为了简单起见,这类安全红线都是直接明确规定任意场景下不得使用md5,这时你只需要100%的遵从就行。如果你试图去挑战合规团队的红线,想澄清md5在你的使用场景下仍然没有安全问题,那么说服他们所花的时间肯定够你做完所有系统的md5替换升级了。尽管如此,我们技术爱好者总是喜欢拆闹钟,喜欢刨根问底,所以就有了此文。
对于RSA算法,由于大多数软件系统都可能基于openssl来开发,而openssl低版本一般会将e=3作为默认的RSA公钥指数。选取小公钥指数主要是为了提高加密或签名验证的性能,比如选e=3只需要2次模乘(ModMul),而随机选择的e(假设n是1024-bit)则大概需要1000次模乘。正因为如此,选用小公钥指数的RSA在签名验证和加密操作上要比ECC算法(ANSI X9.62)高效得多。
那么,选用e=3对安全性到底有什么样的影响呢?如果你不是密码学专家,在实现RSA算法时,不能局限于自己对RSA的教科书式理解,一定要完全遵循当前业界公开的算法标准,如PKCS#1 v2.1/v1.5 (2002/1993)或IEEE P1363,或者直接使用公开的密码算法库(如OpenSSL)。下面我总结一下自从RSA诞生以来业界针对小公钥指数(e=3)的一些安全性分析。
2. e=3的安全性分析
(1) Hastad攻击
Hastad描述的攻击经常也被称为广播攻击[1]。
攻击场景:如果Alice打算将消息M加密发送给一组用户,并且这组用户选择的公钥指数e=3,那么攻击者Malice可以通过截获3个密文
便能够有效地恢复出明文M。Hastad进一步指出,即使Alice在加密M之前对M进行了f运算(这里f是一个公开的多项式函数),攻击者仍然能有效地恢复出明文M。所以建议在进行消息填充时一定要选择随机化填充方法,比如OAEP[2],而不是一个确定的填充方法。
影响:PKCS#1 v2.1和v1.5均不受此攻击的影响。
(2) Franklin-Reiter攻击
Franklin-Reiter攻击是一种明文相关性攻击[3]。
攻击场景:假设Bob的公钥为(3, N),Alice发送消息M1和M2给Bob,并且M1 = f(M2) mod N,f是一个已知的多项式。那么攻击者Malice可以截获密文
便能够有效地恢复出明文M。所以建议明文在加密前一定要做随机化处理。
影响:PKCS#1 v2.1和v1.5均不受此攻击的影响。
(3) Coppersmith攻击
首先我们介绍Coppersmith发现的短填充攻击[4]。
攻击场景:假设Bob的公钥为(3, N),Alice发送消息M给Bob。消息M的填充方法是遵循PKCS#1 v1.5,即在消息尾部或头部直接填充随机串。如果攻击者截获到Alice发送给Bob的关于消息M的两个不同的密文,即
如果填充的随机串r的长度低于消息长度的1/9,那么攻击者便能够有效地恢复出明文M。注意该攻击对e = 65537无效。
影响:PKCS#1 v2.1不受影响,但PKCS#1 v1.5受此攻击的影响。
[补充说明] Coppersmith在密码分析领域做了很多杰出的工作,比如Coppersmith定理[4]已经成为一个密码分析工作的奠基石。
Coppersmith定理:令N为大整数,f是度为e的多项式。给定N和f,可以有效地计算出方程f(x)=0 mod N所有小于N^(1/e)的解。
应用该定理,另一个简单的攻击如下:当e=3时,给定一个密文,如果攻击者已知2/3的明文比特,则能恢复出整个明文。
(4) BDF攻击
BDF攻击[5]是针对私钥d在部分暴露之后的攻击。
攻击结论:令(N, d)为私钥,N的长度为n-bit。假若d的n/4个低位比特信息被泄露,那么在e < sqrt(N)条件下,攻击者可以有效地恢复出私钥d。
另外值得一提的是,如果e = 3,我们很容易知道d的取值范围,而且这个取值范围的区间为sqrt(N)量级。这也就是说,如果e = 3,RSA就天然地泄露了d的一半比特位信息,只不过泄露的是高位比特,而不是低位比特。但是目前还没有发现针对d的高位比特泄露的有效攻击。
影响:PKCS#1 v2.1和v1.5均不受此攻击的影响。
(5) 其它攻击
关于RSA的其它相关攻击,如小私钥指数攻击、共模攻击、盲化攻击、时间攻击等,请参见[6, 7].
3. 结论
(I) 对于RSA加密来说,如果在实现上遵循PKCS#1 v2.1 (OAEP填充),目前还没有发现有效的攻击;但如果是遵循PKCS#1 v1.5 (明文尾部直接填充),那么存在Coppersmith攻击。
(II) 对于RSA签名来说,目前对于PKCS#1 v2.1 (PSS填充)和PKCS#1 v1.5 (填充方法:0001FF...FF00||ASN.1||H(M)) 来说都还没有发现有效的攻击。
综上所述,选用e=3作为RSA的公钥指数,只要用法正确,目前仍然是安全的。
附1: 关于e=65537 (0x10001) 的说明
NIST SP800-78 Rev 1 (2007) 曾强调“不允许使用比65537更低的公钥指数e”,但PKCS#1却从未有过类似的建议。e=65537=(2^16+1),其签名/加密运算只需要17次模乘,性能也算不错。但我猜测选这个值的可能只是一个介于小指数攻击和运算效率之间的一个折中考虑,即以防万一将来有人彻底攻破"e=3"而侥幸"e=65537"可能还是安全的。
参考文献
[1] J. Hastad, Solving simultaneous modular equations of low degree. SIAM J. of Computing, 17: 336-341, 1988
[2] M. Bellare and P. Rogaway. Optimal asymmetric encryption. In EUROCRYPT'94, LNCS 950, pp 92-111, 1994.
[3] M. Franklin and M. Reiter, Low-exponent RSA with related messages. In EUROCRYPT'96, LNCS 1070, pp 1-9, 1996.
[4] D. Coppersmith. Small solutions to polynomial equations, and low exponent RSA vulnerabilities. Journal of Cryptology, 10: 233-260, 1997.
[5] D. Boneh, G. Durfee, and Y. Frankel. An attack on RSA given a fraction of the private key bits. In AsiaCrypt'98, LNCS 1514, pp 25-34, 1998
[6] D. Boneh, Twenty years of attacks on the RSA cryptosystem, 1999.
[7] http://www.rsa.com/rsalabs/node.asp?id=2216
//欢迎技术交流!seccloud@126.com

本文分析了RSA算法中使用小公钥指数e=3的安全性,包括Hastad攻击、Franklin-Reiter攻击、Coppersmith攻击和BDF攻击等,并指出在正确使用填充方式(如OAEP)的情况下,e=3的RSA仍然是安全的。
2427

被折叠的 条评论
为什么被折叠?



