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描述的攻击经常也被