NIST 椭圆曲线种子之谜破解:只是把时间戳喂给了 drand48
来源:words.filippo.io — 2026-10-16
📋 概述
Filippo Valsorda 三年前设的悬赏被 Anthropic 的十人团队领走了:NIST 那五条椭圆曲线(P-192、P-224、P-256、P-384、P-521)的参数种子,既不是某句「咸湿英文句子」的 SHA-1 哈希,也不是什么藏了后门的神秘常数,而是 1997–98 年间用 POSIX 标准随机数生成器 drand48 产生的——把当时的 UNIX 时间戳喂给 srand48(),然后一次一个字节地取数,每凑满 20 字节就按 ANSI X9.62 去试生成曲线,不合法就丢弃重来。Filippo 用 Go 重新实现了算法并复核了结论,同时指出官方流程里还有两条从未写进文档的筛选条件:一是曲线阶 n 的位长大于基域 p 的位长就丢弃;二是有大约一半同样合法的种子最终没被发布,原因至今不明。这个结果直接排除了 2017 年 Bernstein 与 Lange 提出的「在选种子上留 70 比特自由度、定向挑弱曲线」的可能性,也让 NIST 曲线的可信度叙事正式补齐。团队把赏金捐给了运营 Let's Encrypt 的 ISRG,金额被翻三倍到 36,864 美元。
🔑 核心要点
- 破解路径出奇地朴素:把 1997 年的时间戳传给 srand48(),再用 drand48 一次吐一个字节,凑 20 字节就按 ANSI X9.62 试生成曲线
- 一旦某个种子生成的曲线通过校验,同一个时间戳还会继续往后取种子,因此一个时间戳可能产出多条曲线
- 还有两条没写进任何规范的条件:曲线阶 n 的位长超过基域 p 的位长就丢弃;而剩下约一半合法种子莫名未被发布,团队试了多种解释都拟合不上
- 悬赏由 Anthropic 的十人团队于 2026-10-15 01:07:51 UTC 领取,奖金捐给 ISRG 并被翻三倍至 36,864 美元
- 对安全性最实质的结论是:即便 NSA 当年可以任选时间戳、也可从前 16 个候选里任选,自由度也只剩约 30 比特,既不足以瞄准一小类弱曲线,也不足以嵌入 NOBUS 后门
- Filippo 的个人立场随之翻转,他现在更推荐 NIST 曲线而非 Curve25519/Ed25519/X25519——只是这批曲线也快被后量子签名取代了
💡 金句
即使 NSA 当年可以任意挑选 1997–98 年间的任何一个时间戳,并从前 16 个素数阶候选里任选(这已经宽松地覆盖了那些无法解释的丢弃),他们也只剩大约 30 比特的自由度。不足以定向瞄准假想中的一小类弱曲线,也不足以嵌入任何一种 NOBUS 后门。
👍 0
👎 0
← 返回 Lobsters 首页