在Trail of Bits,我们审查过大量代码。从主流开源项目到令人兴奋的新专有软件,我们见识过所有类型。但这些系统都有一个共同点:出于某种难以解释的原因,人们似乎仍然认为RSA是值得使用的加密系统。让我为您节省时间和金钱直截了当地说——如果您向我们提交使用RSA的代码库,您将需要支付我们解释为何应该停止使用它所需的时间费用。
RSA本质上是一个脆弱的加密系统,包含无数普通软件工程师难以避免的陷阱。弱参数难以(甚至不可能)检查,其性能低下迫使开发人员采取风险捷径。更糟糕的是,在填充预言攻击被发现20年后,这类攻击仍然猖獗。虽然理论上可能正确实现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分解的困难性。但开发者经常为加速生成而选择特定形式的素数,这会导致灾难性后果:
小私钥指数d(d < N⁽¹/⁴⁾)会导致密钥恢复攻击。虽然建议使用大d并结合中国剩余定理加速,但实现复杂性会增加错误概率。
小公钥指数e=3或1会引入多种漏洞:
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是完全不可接受的行为。没有例外。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。