Anthropic:Claude 用半小时查清 NIST 椭圆曲线种子的来历——不是哈希,是 1997 年的 lrand48 加 Unix 时间戳
一个悬了二十多年的问题:NIST 那几条椭圆曲线的种子参数到底是哪来的。NSA 给的,没解释。有人猜是某个玩笑短语的哈希,也有人怀疑背后有猫腻。Anthropic 说,他们让人工智能试了一下,半小时出结果——那是 1997 年某台机器上 C 库随机数生成器的输出,种子是当时的 Unix 时间戳。
先把问题本身讲清楚。ECDSA 是使用最广的椭圆曲线密码标准,2000 年作为 FIPS 186-2 数字签名标准的一部分被 NIST 采纳。对素域与二元域上的曲线,规范公布了一个「种子」参数,种子的哈希值用来定义曲线的系数 b。麻烦在于种子的来历:它们由 NSA 提供,没有给任何解释或理由。比如 NIST P-256 的种子是 C49D3608 86E70493 6A6678E1 139D26B7 819F7E90,却没人知道它从哪儿来。Koblitz 与 Menezes 写过一篇综述《A Riddle Wrapped in an Enigma》专门讨论这段争议。
流传最广的说法是「某个玩笑短语的哈希」。长期在 NSA 工作的 Jerry Solinas 2015 年说过,大意是他相信当时用的是计数器而不是多次哈希,消息内容类似于「给 Bob 和 Jerry 加薪」或者「Bob 和 Jerry 说了算」,真正写代码的是 Bob Reiter,而 Reiter 也记不清细节了。Jerry 于 2023 年去世,同期的其他同事没有回应,这条线索基本断了。Anthropic 说,内部有几位员工按这个方向追过,都没成功——事实证明那个猜测是错的。
真正的答案在方法上。Anthropic 写:2026 年 10 月,一位好奇的员工问内部研究模型能不能在不给任何提示的情况下弄清这些种子是怎么生成的。不到半小时,Claude 找出了 P-192、P-224、P-256、P-384、P-521 五个种子的来源——它们都不是任何哈希算法的结果,而是 C 库 lrand48 随机数生成器的输出,用 Unix 时间戳做初始化种子。机制是:以时间戳 t 初始化生成器,每轮取 20 字节作为一个候选种子,第 1 个 20 字节是候选 1,第 2 个是候选 2,以此类推。P-256 需要 1842 轮才输出标准中的那个种子。
怎么找到的,过程比结论更有意思。按玩笑短语去搜哈希毫无结果,Claude 换了角度:先假设当年生成曲线的软件用的是 1990 年代 C 库自带的伪随机数生成器,这类老生成器足够弱、输出可被识别,一旦认出来就能反推初始状态。它写了个扫描器,沿着每个已公布的种子逐位滑动,测试相邻的数据块是否为某个 1990 年代生成器的连续输出,覆盖 34 种生成器与输出切片的组合。然后它注意到部分种子的高位特征:拆成五个 32 位字后,十条种子里有四条的 20 个字最高位全是 0——随机出现这种模式的概率是 1/5810。这是线性同余生成器 lrand48 的签名,因为它只返回 48 位状态的高 31 位。恢复状态的办法是拿第一个字,穷举 17 个隐藏位的全部 2¹⁷ 种取值,再验证后四个字是否吻合,四条种子全部命中。
素域曲线的种子来自同一个生成器,但每个输出保留的位数更少,所以要从被截断的输出里恢复内部状态。Anthropic 说,这在数学上是教科书式的格问题,用 Lenstra–Lenstra–Lovász(LLL)基约简算法求解。因为不知道种子里可能暴露状态中的哪几位,模型把求解器在每个窗口上都跑了一遍。结果五条 NIST 素域曲线种子加上五条 ANSI X9.62 标准的种子全都是同一模式:lrand48() >> 23。每个恢复出的 48 位状态都能重新生成对应的 160 位种子,这不是巧合能做到的。时间线也挖出来了:十条素域种子的 srand48 初始化值都是时间戳,对应 1997 年 5 月到 1998 年 4 月;四条二元域曲线的初始化值读出来是 1984 年 2 月,时间戳翻倍后正好对应 1998 年 4 月 17 日,比 P-224 那次晚两周——程序可能是把时钟减半了。
结论要照原文写,别夸大。Anthropic 明确说:这不是密码学破解、不是新攻击、也不是曲线存在弱点;恰恰相反,这让人们更相信这些曲线是在没有后门或故意弱点的情况下选出来的。多年来人们怀疑 NIST 曲线参数的来历,是因为它们被交给 NIST 时没有说明怎么选的。现在看,种子是用一个非常朴素的方式生成的:一个常见伪随机数生成器加上时钟初始化,任何人都能复现。可被颠覆的空间小得多。页面开头还有一句直白的话:读者应当把它当成一个有趣的收尾章节,没有任何需要采取的行动,也不用改变什么做法。
边界也要写清楚。第一,这是 Anthropic 自己发布的叙述,包括「不到半小时」这个时间说法,没有第三方复现记录或时间日志;不过他们公开了可复现的代码(CC0 授权),包括把十条素域种子与四条二元域种子重新算出来的脚本,以及用 LIP 的 zrandom 生成基点 x 坐标并验证与已公布基点一致的代码,这一点让结论可被独立检验。第二,仍有没解开的部分:第五个二元域种子 B-163 用 Claude 试过的所有办法都对不上,依然无法解释;P-224、P-256、P-384、P-521 的基点是怎么生成的也不知道,NIST 二元域曲线的基点同样不明。第三,原文提到生成过程中跳过了一些候选:P-256 的候选 876 同样能得到一条参数选取方式相同的素阶曲线,P-224 那次跳过了三条,ANSI X9.62 例子的两次运行又跳过了七条,选择标准未知。Anthropic 的判断是跳过数量很少,不足以支持「故意挑弱曲线」的猜测,但也没有给出确定答案。第四,这条消息不改变任何人的安全配置,别拿它当升级理由。
🤔 常见问题解答
这算不算密码学被攻破了?
不算。Anthropic 明确说这不是破解、不是新攻击、不是弱点;反而降低了「曲线被故意弱化」的可能性。不需要任何行动。
种子的真正来源是什么?
C 库 lrand48 随机数生成器的输出,用 Unix 时间戳初始化,每轮取 20 字节作候选。P-256 的种子是第 1842 个候选,初始化时间在 1997 年 8 月。
还有没查清的吗?
有。第五个二元域种子 B-163 对不上任何模型;P-224/256/384/521 与 NIST 二元域曲线的基点生成方式也不清楚;为何跳过个别可用候选同样未知。
结论能自己验证吗?
可以。Anthropic 在页面上公开了 CC0 的复现代码,包含按时间戳与迭代次数重算种子的脚本,以及用 LIP zrandom 生成基点并比对已公布 Gx 的代码。
🛠️ 推荐工具
- 时间戳转换工具 整条线索的核心就是 Unix 时间戳:把 1997 年那串秒数来回换算,你也能自己对着表验证一遍。
- 哈希生成工具 旧猜测是「玩笑短语的哈希」,自己拿几种算法跑一遍就知道那条线索为什么走不通。
- Base64 编解码工具 种子、基点、曲线参数在证书和文档里常以十六进制或 Base64 出现,来回转换是对参数的日常操作。
- 正则表达式测试工具 从头文件或日志里把种子、坐标批量抠出来,正则是最快的路子,先在测试器里调好再跑全量。
- 本地大模型运行器 原文的做法是「写扫描器 + 穷举 + 格约简」,这类任务本地跑模型配合脚本,比把字节全丢到云端更可控。
总结
Anthropic 前沿红队 2026 年 10 月发布研究:内部研究模型 Claude 在不到半小时内查清 NIST P-192、P-224、P-256、P-384、P-521 五条椭圆曲线种子参数的来源。它们不是任何哈希的输出,而是 C 库 lrand48 随机数生成器的输出,用 Unix 时间戳初始化,每轮 20 字节作为候选;P-256 的种子是第 1842 个候选,初始化时间落在 1997 年 5 月至 1998 年 4 月之间。方法是从玩笑短语哈希的失败中转向:假设用的是 1990 年代 C 库伪随机生成器,写扫描器覆盖 34 种生成器与切片组合,靠「20 个字最高位全 0」这一概率 1/5810 的签名认出 lrand48;四条二元域种子用穷举 2¹⁷ 隐藏位恢复状态,十条素域种子(含 ANSI X9.62 五条)用 LLL 格约简从截断输出恢复,全部符合 lrand48() >> 23。Anthropic 强调这不是密码学破解,反而让「故意后门」更不成立,且无需采取任何行动;页面上公开了 CC0 复现代码。边界:叙述由 Anthropic 自述、「半小时」无第三方时间日志;B-163 种子、各曲线基点生成方式、以及为何跳过个别可用候选仍未解。本文事实全部来自下方来源,未加入推测。
来源链接: Anthropic 官方研究页:Claude reveals ECDSA curve origins(含 CC0 复现代码)
NIST FIPS 186-2 原文(曲线与种子参数的规范文档)
Koblitz & Menezes《A Riddle Wrapped in an Enigma》(种子争议综述)
lrand48 手册页(只返回 48 位状态的高 31 位)