最近在思考 RSA加密算法(RSA)的安全性,其依赖分解大数难度。Web公钥基础设施(Web PKI)十多年前弃用 1024 位 RSA。几天前有人分解 862 位 RSA-260 密钥。现用至少 2048 位,但将来因量子风险弃用。这让人想早期小密钥能否在台式机分解。早期 Web公钥基础设施无标准,网景(Netscape)1994 年推安全套接层(SSL),IE(Internet Explorer)随后,正值密码出口限制。是否有足够小的密钥可分解?觉得好玩。
正文
我最近一直在思考 RSA 的安全性。RSA 加密依赖于分解一个大半素数(semiprime)的难度,但“大”到底是什么概念很有意思。Web PKI 在十多年前就弃用了 1024 位 RSA,虽然我不知道有谁分解过那种长度的密钥,但拥有大量计算机的国家政府或其他组织是有可能做到的。就在几天前,有人分解了 RSA 分解挑战中的 862 位 RSA-260 密钥。那是我所知的最大分解记录。如今全球至少使用 2048 位 RSA,但鉴于未来量子计算机的风险,连这个长度也很快会被弃用。
这让我想到:小型 RSA 密钥哪怕用一台普通的台式电脑也能分解。在 Web PKI 早期,既没有标准也没有最低要求。Netscape 在 1994 年推出了 SSL 支持,IE 紧随其后。那还是密码学出口限制的时代。有没有小到我能分解的密钥呢?我没什么正当理由要这么做,但看起来挺好玩的。
剧透当然是有,但首先我们得找个能破解的密钥。
幸好,浏览器安装包里自带根证书,archive.org 上有 Internet Explorer 和 Netscape 的存档。存档虽不全面,但应该能很好覆盖旧的根 CA。我下载了这两个合集,用 Claude Code 提取所有根证书。我还托管了一个由 Claude 生成的网页,列出那些古老的旧根证书。我虽没验证这个大语言模型输出是否完全可靠,但看起来挺合理。
用那个网站的筛选功能,我们能找出哪些小密钥被信任用于 SSL。

找到了!我们有目标了。早在 1999 年 3 月,Netscape 4.51 附带了一个受 SSL 信任的 512 位 RSA 证书颁发机构,还有一个用于 S/MIME。这两个根证书都来自早已倒闭的加拿大证书颁发机构 E-Certify。
同年晚些时候,512 位的 RSA-155 被分解,所以即使在当时这也太弱了,可能本来就不该发布。
Netscape 在 2002 年移除了 E-Certify 的 512 位根证书。遗憾的是,Internet Explorer 似乎从未发布过任何用于 SSL 的 512 位根证书,所以我们的乐趣仅限于相对短时期内 Netscape 的证书。
分解根证书里的公钥,就能得到重建私钥所需的两个素数。我在自己的 Ryzen 9 5950X 台式机上运行 CADO-NFS;分解用于 SSL 的 E-Certify RSA 512 Gold Server 花了 32 小时,分解用于 S/MIME 的 E-Certify RSA 512 Gold Client 又花了 29 小时。你可以在下面拿到生成的私钥。
假设你不知怎么正运行着 Netscape 4.51,且时钟设在 E-Certify 根证书过期日 2003-10-16 之前,你就能用这些私钥签发证书。地球上符合这描述的人一个都没有……除了我搭的这个虚拟机。
验证签发的证书能在 Netscape 4.51 里工作本身就是一场探险,因为 Netscape 4.51 和任何现代 TLS 协议栈在 TLS 能力上毫无交集。于是我又用 Claude Code 写了个用 Go 语言定制的老式 TLS 服务器。这个网站公开托管在 e-certify.fly.dev,欢迎你用自己的 Netscape 副本试试,但它在任何现代浏览器里都打不开。

或者,如果你想用这些老密钥托管自己的网站,密钥和工具都在仓库 https://github.com/mcpherrinm/ancientroots 里。或者干点更坏的,比如对那些时钟设在 25 年前的 Netscape 4.51 用户做 SSL 中间人攻击……
C=CA, O=E-Certify, OU=RSA Gold Server, CN=E-Certify RSA 512 Gold Server -----BEGIN CERTIFICATE----- MIIByjCCAXSgAwIBAgIBATANBgkqhkiG9w0BAQQFADBjMQswCQYDVQQGEwJDQTES MBAGA1UEChMJRS1DZXJ0aWZ5MRgwFgYDVQQLEw9SU0EgR29sZCBTZXJ2ZXIxJjAk BgNVBAMTHUUtQ2VydGlmeSBSU0EgNTEyIEdvbGQgU2VydmVyMB4XDTk4MTAxNjEz Mzc1M1oXDTAzMTAxNjEzMzc1M1owYzELMAkGA1UEBhMCQ0ExEjAQBgNVBAoTCUUt Q2VydGlmeTEYMBYGA1UECxMPUlNBIEdvbGQgU2VydmVyMSYwJAYDVQQDEx1FLUNl cnRpZnkgUlNBIDUxMiBHb2xkIFNlcnZlcjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC QQDNVQ93Ev7zgNaJAR1Z7gCydU6mky1e/B4EbY1NsdtfsitU9cELqg5uRJDPA40n CDPeOyil1lJ5N8hekcqJAkkXAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQEEBQADQQB09SV6OeeDEP8Je3DOLNZ24U98NHqIBTDyB4sRpDmNdHum +3rm4AYtznBxG5hEShO89bcWi3yJtBITGuTRDnMq -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIBOgIBAAJBAM1VD3cS/vOA1okBHVnuALJ1TqaTLV78HgRtjU2x21+yK1T1wQuq Dm5EkM8DjScIM947KKXWUnk3yF6RyokCSRcCAwEAAQJAWZ2FOWf+A9K4T2VAJS69 +SU/pW3YwHrysuYJZN56K0Iz+Hqd1hBhCeJ3/T+/cvXq+ctD0x3uOxU1rDSeCoMO KQIhAPdbc1wTm3twWDYi1iXmRBXz97MYxRFld/KFr8x5+tK9AiEA1IG09a+oVg6j NMDj6GD7spaD4q9t1wk/Nyq/MTLPkmMCIEzzYjvuzZvlI0wUIlLAA8Zgk1pgBk6X Jm2IMVyHRgRxAiEAjZKgCTHuVu7HgiSjcTPzW0X1NTckWSc66zjaSR+Ns/sCICxT yXoTXWQCWL6BMpf2no7IlvoEnBIrED2Frq3PxlEA -----END RSA PRIVATE KEY-----
C=CA, O=E-Certify, OU=RSA Gold Client, CN=E-Certify RSA 512 Gold Client -----BEGIN CERTIFICATE----- MIIByjCCAXSgAwIBAgIBAjANBgkqhkiG9w0BAQQFADBjMQswCQYDVQQGEwJDQTES MBAGA1UEChMJRS1DZXJ0aWZ5MRgwFgYDVQQLEw9SU0EgR29sZCBDbGllbnQxJjAk BgNVBAMTHUUtQ2VydGlmeSBSU0EgNTEyIEdvbGQgQ2xpZW50MB4XDTk4MTAxNjEz MzQwOFoXDTAzMTAxNjEzMzQwOFowYzELMAkGA1UEBhMCQ0ExEjAQBgNVBAoTCUUt Q2VydGlmeTEYMBYGA1UECxMPUlNBIEdvbGQgQ2xpZW50MSYwJAYDVQQDEx1FLUNl cnRpZnkgUlNBIDUxMiBHb2xkIENsaWVudDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC QQBwCcT1iYlNyKPywB/kffD8esiCzGYJxSnTXQjU6ej/XxnA+9yqjzAMPtqFd094 wM89Vsmz9YOWSO6Qn6wOAs45AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQEEBQADQQAdktdM5AzW+0o96eHCHwD3UfzxPvjKxPEjiI/QTn+njHt/ BEJb9yZatONRckglVc9v8P8Dy8HZGQD0+Pn0uxhW -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIBOQIBAAJAcAnE9YmJTcij8sAf5H3w/HrIgsxmCcUp010I1Ono/18ZwPvcqo8w DD7ahXdPeMDPPVbJs/WDlkjukJ+sDgLOOQIDAQABAkASXZeaxFPsm0I8zb+snfR9 /saVolnrqhVEH5EODdXy3nSm6fpdrsDwQDDg52biXjIUizQYdd3OourOn0/PyyiB AiEAyW4gFFgM0dJ+Y//vrIyQutLeH/5c/Vq3Lbcxv7R908kCIQCOZAAv8OCG/2oH yKaYj/EoxcFZ9csVh/kjicO/JIX+8QIhAMEzAkvhBDLALYAmvDCJBkxa8rhHFdPf jbCodGwGZ2WZAiB//XmBnlZkYl/PoVfGmNRgHun+0AZ9UxzqCeJvBQiBMQIgHWlr 0Sh1a8K2pQP2ktgmL3RH5+1Qd2wLx/hhGWtwPvU= -----END RSA PRIVATE KEY-----
另外有个额外收获,Internet Explorer 3.02 发布了一个叫 OU=Test VeriSign Commercial Software Publisher CA 的代码签名 CA。我不确定那是干嘛的,但它同样容易分解。在 ancient roots 仓库里还有几个看起来像测试的 512 位 RSA 密钥,所以你可以试着多分解几个,或者看看它们能用来干啥!
L=Internet, O=VeriSign, Inc., OU=Test VeriSign Commercial Software Publisher CA -----BEGIN CERTIFICATE----- MIIByDCCAXKgAwIBAgIQIsTi2AgEp+1OkpqVLROnazANBgkqhkiG9w0BAQQFADBl MREwDwYDVQQHEwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 BgNVBAsTLlRlc3QgVmVyaVNpZ24gQ29tbWVyY2lhbCBTb2Z0d2FyZSBQdWJsaXNo ZXIgQ0EwHhcNOTYwNTAyMTcwMTUyWhcNOTcwNTAyMTcwMTUyWjBlMREwDwYDVQQH EwhJbnRlcm5ldDEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLlRl c3QgVmVyaVNpZ24gQ29tbWVyY2lhbCBTb2Z0d2FyZSBQdWJsaXNoZXIgQ0EwXDAN BgkqhkiG9w0BAQEFAANLADBIAkEA1XqTpg1hQWq6IKvBXLor12GBTH6y4BHyOJjy MJISn0ZWBqkbZiEfoWgaWXhEwrvxMWonLA2vYFHijofFG4YIjwIDAQABMA0GCSqG SIb3DQEBBAUAA0EAKxuR/KPJPDNJgw0ORqqM7SlvIeqnVP71OEFytqPaZw/3TPEi 9oK6PzBvPdLBZlnjRd/hf58FW2+/PXxsFl78Mg== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIBOwIBAAJBANV6k6YNYUFquiCrwVy6K9dhgUx+suAR8jiY8jCSEp9GVgapG2Yh H6FoGll4RMK78TFqJywNr2BR4o6HxRuGCI8CAwEAAQJAYM8tlegLarcToS1CiuKC bzHwiNgMFkENL01sx0n21/MhmA6pBiSwVn3Pu6yvx6EMB1zbCsaBHs/VTyofMbRW QQIhAOqdAX3bVZwAlZ5FDWyfGwgE0FXEIQ85kjcihrFeDs49AiEA6PBfC0YuNMSa M135mH+MEY1GEmQe9xHcXpiYAPazCrsCIQDDtuw6oJEfDYHCwRn8xhGXs+RT18Q4 Xi9yXRP9vFgfhQIhAIYUTfD0XYZcIBIvJosj56D2u328iaJXcow0s1Hirp4fAiAG bza0Qcc27d/0OzKOqep3JrDl/L5HidTj2XEqEXmnXw== -----END RSA PRIVATE KEY-----
最后,SSL Labs 觉得我的测试网站棒极了。

评论
这场讨论没有一边倒地感叹“512位已被征服”。有评论者仔细计算密钥长度增长带来的破解成本,认为不能把消费级GPU破解512位的成功直接外推到1024位;另一路人则从旧证书嗅到长期风险——政府可能一直在归档密文,等待未来解密。与此同时,作者让LLM生成部分关键内容且声称“没验证但看起来合理”,成为评论区最集中的批评点。
破解512位不是1024会失守的证据
- 评论者指出,RSA位长每增加一位,破解成本都是成倍上涨,而不是线性相加;即便硬件进步了几个数量级,传统方法也未必能在可行时间内破解1024位。Shor算法若真正可用当然会让争论作废,但它要求每个新增RSA位都对应更多稳定量子门,所以更值得关注的,是稳定量子比特的进步曲线与RSA成本曲线何时相交。(高赞)
RSA每增加一位破解成本都会翻倍;与其急着说1024也岌岌可危,不如看看稳定量子比特的趋势线和RSA成本趋势线什么时候相交。(@ggm)
真正令人惦记的是“录下来,等以后解”
- 早年大部分流量根本没有加密;等后来加密普及,反而给有能力长期存档的机构留下了大量等待算力追赶的密文。评论者好奇,哪些政府正在把匿名政治言论录下并保存,准备在解密成为可能的那一天再打开。(少数人)
我很好奇,哪些政府正在把匿名政治言论录下来存着,等到将来能够解密的那天再处理。(@goalieca)
“看起来合理”的AI输出,恰恰需要先验证
- 作者承认自己尚未验证LLM生成的内容,评论者认为这正好说明必须验证:生成貌似合理的文本正是LLM的本行,未经独立测试的内容不能当作可靠结论。(较多人)
- 另一名评论者则对文章把许多有趣细节交给AI表示遗憾,宁愿作者亲自解释为什么需要自定义TLS实现,而不是让人自己去翻源码注释。(较多人)
LLM的看家本领就是产出“听起来挺像那么回事”的文本,所以这部分恰恰不能直接信;只有你实际测试过的那一块才应期望是正确的。(@mitxela)
有价值的补充
- 作者要兼容的目标是 Netscape Communicator 4.51,包括40位导出版和128位美国版,并把系统时间设为2000年。Go 的 crypto/tls 自 1.14 起移除 SSLv3,也从不接受 Netscape 4 发送的 SSLv2 兼容 ClientHello,更没有 RC4-MD5 或40位导出套件;所以只能用标准库原语(RSA PKCS#1 v1.5、RC4、DES/3DES、MD5、SHA-1)自写一个极小的 SSLv3 服务端。
- 512位RSA并非随手挑的“弱密钥”:为了让40位导出客户端可以直接把预主密钥加密给服务器、省去 ServerKeyExchange,服务器只能使用512位密钥。这是当时美国出口管制和客户端能力共同留下的历史痕迹。
- 现代扫描器对这套复刻服务器自动给出四个不同的“F”,被评论称为整篇文章最妙的注脚:精心还原的历史环境,放在今天的安全标准下浑身都是洞。
对“地球上零个人会这么干”表示怀疑
- 作者称除了自己搭的虚拟机,地球上没有人在这种环境下使用那些私钥签发证书,但评论者认为地球人口基数这么大,“零个人”的判断未必站得住;也有人提到自己过去做过类似寻找小证书的尝试,只是没有这么彻底。(少数人)
我以前也沿着同样的思路找过,只是没他搜得那么细,从没见过这么小的证书。(@Retr0id)
社区里一句“哈哈,干得好,Marc Andreessen”,也把这场数字考古衬出一丝对Netscape时代的戏谑致敬。