立即停止使用RSA:脆弱加密系统的全面剖析
立即停止使用RSA
在Trail of Bits,我们审查过大量代码。从主流开源项目到令人兴奋的新专有软件,我们见识过所有类型。但这些系统都有一个共同点:出于某种难以解释的原因,人们似乎仍然认为RSA是值得使用的加密系统。让我为您节省时间和金钱直截了当地说——如果您向我们提交使用RSA的代码库,您将需要支付我们解释为何应该停止使用它所需的时间费用。
RSA的本质脆弱性
RSA本质上是一个脆弱的加密系统,包含无数普通软件工程师难以避免的陷阱。弱参数难以(甚至不可能)检查,其性能低下迫使开发人员采取风险捷径。更糟糕的是,在填充预言攻击被发现20年后,这类攻击仍然猖獗。虽然理论上可能正确实现RSA,但数十年的毁灭性攻击证明,这种壮举在实践中可能无法实现。
重新认识RSA
RSA是一种公钥加密系统,有两个主要用例:首先是公钥加密,允许用户Alice发布公钥,让任何人发送加密消息;其次是数字签名,允许Alice"签名"消息以便验证完整性。RSA的便利之处在于签名算法基本上就是加密算法的反向运行。
参数设置机制
Alice需要选择两个素数p和q生成模数N=pq的整数群,然后选择满足ed=1 mod (p-1)(q-1)的公钥指数e和私钥指数d。Bob可通过计算C=Me (mod N)加密消息,Alice通过M=Cd (mod N)解密。签名过程类似但方向相反。
自毁式参数选择
素数选择陷阱
RSA安全基于大数N=pq分解的困难性。但开发者经常为加速生成而选择特定形式的素数,这会导致灾难性后果:
- 素数重用:如果p或q在其他RSA模数中重用,可通过GCD算法轻松分解
- 相关素数:当p和q共享约一半高位时,可用费马方法分解
- RSALib漏洞:ROCA漏洞影响众多智能卡和安全模块,利用特殊代数性质通过Coppersmith方法分解
私钥指数风险
小私钥指数d(d < N⁽¹/⁴⁾)会导致密钥恢复攻击。虽然建议使用大d并结合中国剩余定理加速,但实现复杂性会增加错误概率。
公钥指数隐患
小公钥指数e=3或1会引入多种漏洞:
- Franklin-Reiter攻击:解密已知固定距离的相关消息
- 密钥恢复:当e较小时,已知秘钥部分位可恢复剩余位
- 签名伪造:Bleichenbacher攻击允许在Firefox和Chrome等实现中伪造任意签名
填充预言攻击无处不在
PKCS #1 v1.5填充方案容易受到填充预言攻击。攻击者利用无效填充错误信息,通过数百万次密文操作逐步解密目标消息。这种攻击特别危险,可恢复TLS会话的预主密钥。
虽然1998年就发现了此攻击,且存在安全证明的OAEP填充方案,但几乎无人使用。即使使用,OAEP也难以实现且容易受到Manger攻击。
替代方案推荐
椭圆曲线密码优势
- 参数公开选择:密码学家完成困难参数决策,开发者只需生成随机字节
- 无填充要求:完全避免填充预言攻击
- 威慑效应:数学复杂性促使开发者使用专家构建的库
具体建议
Trail of Bits推荐使用Curve25519进行密钥交换和数字签名,加密使用结合椭圆曲线密钥交换和对称加密算法的ECIES协议。Curve25519专门设计用于预防其他曲线的潜在问题,且性能优异,可通过libsodium库获得多语言支持。
最终警告
RSA虽是安全通信发展的重要里程碑,但过去二十年的密码学研究已使其过时。椭圆曲线算法在2005年就已标准化,并已集成到直观防误用的库中。RSA的持续流行既表明密码学家未能充分阐明其风险,也表明开发者高估了自己的部署能力。
安全社区需要将其视为群体免疫问题——虽然有些人可能成功部署RSA,但这会给其他开发者错误信号。尽管StackExchange和Github上有大量警告,很少有人相信自己会搞砸RSA,于是轻率推进。最终用户将为此付出代价。这就是为什么我们必须一致认为:在2019年使用RSA是完全不可接受的行为。没有例外。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码