
引言
这几天密码学圈子炸了个不大不小的雷:加州大学圣地亚哥分校(UCSD)和法国 Inria 的研究团队,没偷到私钥、没做因数分解、也没用量子计算机,硬是用普通 CPU 集群跑了 5 个月,伪造出了有效的 1024 位 RSA 签名。
你可能第一反应是"RSA 完了?"——先别慌。这次攻击离你手机里的 HTTPS 还很远,但它推翻了一个密码学界默认了几十年的假设:想伪造 RSA 签名,必须先拿到私钥。这条"天经地义"的路,现在被证明有别的走法。
这篇文章把这件事讲清楚:攻击到底怎么做的、为什么说"理论上很震撼、实际上暂时够不着"、以及哪些系统真的需要今晚就去查一查。
事件复盘
9 月 24 日,Ars Technica 报道了这批研究成果,论文预印本已挂在 IACR ePrint(编号 2026/2131),代码也开源在 GitHub 上(仓库名很朋克:NSNFSSSFSFN,"Nearly SNFS-Speed Signature Forgery Sans Factoring N"——不用因数分解的近特殊数域筛速度签名伪造)。研究团队由 UCSD 的 Nadia Heninger 教授领衔。
先交代背景。RSA 的安全性,几十年来都建立在一个等式上:破解 RSA ≈ 把一个大整数分解成两个质数的乘积。业界评估 1024 位密钥要 50 万到 100 万 CPU 核年、约 2^80 次运算,2048 位更是"不会发生"级别。全世界按这个标准给密钥长度定安全等级,NSA、NIST、欧盟 ENISA 都要求密码系统至少提供 128 位安全强度。
这次研究干的事,是绕过这个等式而不是穿过它:
- 攻击前提:攻击者需要临时访问一个"预言机"(oracle)——一个会返回**原始 RSA 计算结果、不加填充(padding)**的签名或解密服务。典型场景是 HSM(硬件加密机)或签名服务里开着 RAW 模式接口。
- 攻击过程:团队用 2007 年 Joux、Naccache、Thomé 三人提出的 √e NFS 算法(一种数域筛变体),先做基于公钥的预计算(约 1200 CPU 核年),再向预言机发起约 40 亿次(2^32)查询采集数据,之后就永久失去对预言机的访问,也能离线伪造任意签名——每个新签名只要约 180 CPU 核年。
- 实际成本:整个演示共约 1380 CPU 核年,在学术计算集群上跑了约 5 个月。对比之下,正路子——因数分解 1024 位密钥——要 50 万到 100 万核年。省了两个数量级还多。
结论部分最扎心:在这类攻击模型下,1024 位 RSA 的安全强度从 2^80 掉到 2^65,2048 位掉到 2^90,4096 位也只有 2^119——三个常用密钥长度,全部跌破 128 位的监管底线。
需要立刻说清楚的是:研究者和 Ars Technica 都强调,这次攻击对绝大多数现实系统不构成现实威胁。而且论文还没经过同行评审。密歇根出身、如今在 Allurity 做创新负责人的密码学专家 Karsten Nohl 的评价是:如果结果经受住评审,这将是"概念性突破"。
技术核心拆解
这项研究的杀伤力不在"更快",而在"证明了一条不该存在的路"。
拆成三层看:
第一层:攻击的是什么
不是"RSA 算法本身"被通用破解,而是 "教科书式 RSA"(textbook RSA)——也就是不经过任何填充、直接对原始数据做 RSA 运算的用法。它的数学结构太干净,干净到攻击者可以利用。
第二层:填充为什么是护城河
现代 RSA 实现都会加填充:签名用 PKCS#1 v1.5 或 RSA-PSS,加密用 OAEP。填充会给待签数据加随机性、加结构,攻击者拿到的不再是"裸"的 RSA 结果,预言机的查询能力被掐断,整个 √e NFS 攻击链条就接不上。论文原话:对带填充的预言机,"相比因数分解很难有显著加速,对绝大多数现代 RSA 运算不构成即时威胁"。所以你手机里的 HTTPS、代码签名、SSH,基本都在安全区。
第三层:谁真的暴露了
论文点名的现实暴露面是 Privacy Pass——Apple 和 Cloudflare 都在用的匿名认证协议,底层用了盲签名(本质上是某种教科书式 RSA)。攻击它需要先攻陷目标组织的一台服务器,再生成约 2^43 个签名——量大,但 Cloudflare 公开说自己的日流量就是这个量级。密钥定期轮换能大幅压缩成功率,但压不到零。除此之外,任何把 RAW 模式签名接口暴露出去的老旧 HSM 配置、遗留系统,都在同一张风险清单上。
还有个值得记住的细节:这套攻击代码是团队纯手工写的,没用 GPU、没用 AI。研究者自己估计,未来用上这些工具,安全等级还会再降。换句话说,2^65/2^90/2^119 是天花板,不是地板。
功能、安全、合规三层怎么看
- 功能层:RSA 该怎么用还怎么用,主流库(OpenSSL 等)默认带填充,日常开发无感。
- 安全层:自查"裸 RSA"用法(下一节给方法),1024 位密钥尽快退役。
- 合规层:NIST/ENISA 的 128 位门槛是硬标准,1024/2048/4096 位 RSA 在此攻击模型下全部不达标;等保、密评场景里还在用裸 RSA 或长年不轮换密钥的系统,可以借这次研究启动整改。
三个常见误区
误区一:RSA 被彻底破解了,互联网要裸奔了
标题看着吓人,实际攻击链条要求苛刻:你得先能访问一个返回原始 RSA 结果的预言机,再烧 1380 核年算力,而且只对无填充用法有效。主流的 PKCS#1 v1.5、RSA-PSS、OAEP 实现全部不受影响。Ars Technica 和论文作者都明确说"几乎不构成现实威胁"。这次研究的价值是改写安全评估的假设,不是"钥匙已经发到黑客手里"。看到"RSA 完蛋了"式的推送,可以直接划走。
误区二:没有量子计算机,经典攻击永远追不上 RSA
很多人心里的安全模型是:"RSA 只怕量子计算机,量子计算机还早,所以我安全。"这次研究恰恰是纯经典计算机用 5 个月干的,而且代码还没优化。它提醒我们:RSA 的威胁清单不止量子一项。反过来说,Nadia Heninger 团队也明确表示,这个结果不改变后量子迁移的时间表——它只是给"在迁移过程中彻底放弃 RSA、不要留尾巴"多添了一条经典密码学的理由。
误区三:密钥够长就安全,跟实现方式无关
"我用 4096 位密钥,稳得很。"这次研究给了当头一棒:在裸 RSA 攻击模型下,4096 位也只有 2^119,同样低于 128 位线。密钥长度是在"实现正确"的前提下才有意义的参数。一个开了 RAW 签名模式的 HSM、一段直接调裸 RSA 接口的祖传代码,比密钥长度重要得多。密码学里,"怎么用"永远排在"用多长"前面。
实操指引
给你一份按优先级排的自查清单:
1. 排查系统里的"裸 RSA"。 在代码库里搜这些信号:直接调用底层 RSA 原语而没有 padding 参数(比如 OpenSSL 的 RSA_public_encrypt/RSA_private_decrypt 裸用、RSA_NO_PADDING 模式)、HSM 或云 KMS 配置里开着 RAW/None 填充模式的签名接口、自己手搓的"盲签名"逻辑。搜到就是整改对象。
2. 全部走带填充的标准 API。 签名用 RSA-PSS(PKCS#1 v1.5 尚可但不再新增),加密用 OAEP。用成熟库的高层接口,别碰原语层。
3. 淘汰 1024 位密钥,安排密钥轮换。 1024 位本来就是 Deprecated 状态,这次攻击让"尽快"变成了"现在"。签名密钥建立轮换机制——轮换能直接废掉攻击者辛苦攒下的预计算数据。
4. 收紧签名接口。 如果你有对外或对内的签名服务(HSM、KMS、时间戳服务),做三件事:最小化暴露面、按调用方鉴权、限频限速。预言机查询是整个攻击的燃料,掐流量就是掐供给。
5. 把后量子迁移排上日程。 NIST 的 ML-DSA(签名)已经标准化,新系统选型时直接把"迁移路径"写进设计文档。这次研究没说迁移要提速,但说清了一件事:过渡期别让 RSA 留在任何新系统的关键路径上。
6. 关注论文的同行评审结果。 目前结论来自预印本,等正式评审和社区复现后再决定是否调整大规模架构,小系统现在做好第 1—4 条就够。
结尾
这次 RSA 签名伪造研究,最值得带走的是一句话:密码系统的安全边界,是由数学假设和工程实现共同决定的,而工程那一半,随时可能被重新评估。
几十年里大家默认"伪造签名必须先拿私钥",现在这个默认被划掉了一半——在特定条件下,一条更便宜的经典计算路径是存在的。它今天够不着你的系统,不代表明天够不着,更不代表你那些还开着 RAW 模式的遗留服务能继续装睡。
对开发者来说,与其焦虑"RSA 是不是完了",不如今天就打开代码库搜一遍 RSA_NO_PADDING。密码学的事,永远是"查一下"的成本,远低于"出事了"的代价。
你觉得 RSA 会在十年内彻底退出历史舞台吗?评论区聊聊。