“这只是时间戳”:数十年来,最流行的密码标准之一的起源之谜已经得到解释。
我们研究了密码学界这个长期悬而未决的问题,以消除人们对 ECDSA 的担忧,而 ECDSA 是我们使用最广泛的密码标准之一。
读者应将此视为一个有趣的收尾章节,也是多年猜测的终结。无需采取任何行动,也无需做出任何改变。大多数研究人员早已信任这些曲线。享受吧。
ECDSA 是最广泛使用的椭圆曲线密码学标准。它于 2000 年被 NIST 采纳,作为 FIPS 186-2 数字签名标准的一部分,该标准列出了一组不同大小和安全级别的标准椭圆曲线。对于素域和二进制域上的曲线,规范发布了一个“种子”参数,其哈希值用于定义曲线的系数 b。这些种子的来源一直是一个长期存在的问题,因为它们由 NSA 提供,却没有给出任何解释或理由。例如,NIST P-256 曲线的种子为 SEED = C49D3608 86E70493 6A6678E1 139D26B7 819F7E90,但没有信息说明它来自哪里。
尼尔·科布利茨和阿尔弗雷德·梅内塞斯就这一争议撰写了一篇出色的总结,“一个裹在谜团中的谜”,其中讨论了种子值的历史和相关担忧。这个谜团引发了一场对种子来源的业余调查,并催生了给任何能找到它们的人的悬赏。
最精彩的故事是,长期担任NSA雇员的Jerry Solinas用一个幽默口令的哈希值生成了这些种子:
遗憾的是,Jerry 于 2023 年去世,而当时的其他同事也未予回应,这使得这些种子最初是如何获得的这一问题悬而未决。
克劳德找到了种子
几名 Anthropic 员工曾根据一条线索——这些种子是某个幽默短语的哈希值——去追查这些种子,但未能成功。结果证明那是错的。2026 年 10 月,一位好奇的 Anthropic 员工询问一个内部研究模型,它能否在不指向该线索的情况下弄清楚这些种子是如何生成的。
不到半小时,Claude 就发现了 NIST P-192、P-224、P-256、P-384 和 P-521 种子的来源。它们根本不是任何哈希算法的结果,而是以 Unix 时间戳为种子初始化的 C 库 lrand48 随机数生成器的输出!
所使用的算法会从由 Unix 时间戳(t)初始化的随机数生成器(RNG)中采样字节,并进行一定次数(n)的迭代。每次迭代会抽取 20 个字节作为候选种子。因此,前 20 个字节是候选 1,接下来的 20 个字节是候选 2,依此类推。例如,P-256 需要 1842 次迭代才能输出标准化种子。

这意味着什么
这不是对 ECDSA 曲线的密码学破解、新攻击或弱点。事实上,这让我们更加确信这些曲线是在没有任何后门或故意弱点的情况下被选定的。多年来,人们一直怀疑 NIST 曲线参数的来源。它们被提交给 NIST 时,没有提及它们是如何被选定的,这让人们怀疑它们是否可能是为了内置蓄意后门而选定的。这些发现使这种可能性大大降低。这些种子是以非常简单的方式生成的:一个用时钟初始化的常见伪随机数生成器,现在任何人都可以复现。这大大减少了被颠覆的空间,也让我们可以确信这些参数是安全的。
它是如何被发现的
对由传言拼凑出的短语进行搜索,结果一无所获。Claude 尝试了另一个角度:预想生成这些曲线的软件必定是如何运作的。Claude 猜测该软件使用了 1990 年代 C 库附带的伪随机数生成器(PRNG)。这些旧式 PRNG 足够弱,以至于其输出可以被识别出来。识别出该输出将揭示使用的是哪个 PRNG,并可能允许恢复其初始化状态。
Claude 编写了一个扫描器,它沿着每个已发布的种子一次一位地滑动,并测试相邻的块是否是 20 世纪 90 年代老式生成器的连续输出。扫描覆盖了生成器与输出切片的 34 种组合。这时,Claude 注意到某些种子的最高位存在一种模式:它们全为零。写成五个 32 位字时,十个种子中有四个在所有 20 个字中的最高位都是 0。这种情况偶然发生的概率为 1/5810。这是线性同余生成器 lrand48 的特征,它只返回 48 位状态的高 31 位。一旦你知道要寻找它,这个模式用肉眼就能看出来。为了恢复状态,Claude 取了第一个字,尝试了 17 个隐藏位的全部 2¹⁷ 个值,并检查接下来的四个字是否依次符合。这在所讨论的全部四个种子上都奏效。

素曲线种子来自同一个 lrand48 生成器,但每个输出保留的位数更少。Claude 必须从这些位中恢复 PRNG 的内部状态。事实证明,恢复截断线性同余生成器的状态是一个教科书式的格问题,可用 Lenstra–Lenstra–Lovász (LLL) 基约简算法求解。Claude 不知道种子可能暴露出状态的哪些位,因此它在每个窗口上运行求解器。五个 NIST 素曲线种子加上来自 ANSI X9.62 标准的另外五个,全都呈现相同的模式:lrand48() >> 23。每个恢复出的 48 位状态都能重新生成其种子的全部 160 位,这不可能是偶然发生的。

这个线性同余生成器向前运行和向后运行一样容易,因此对于每个种子,Claude 都将状态向后步进,直到它达到本应由 srand48 初始化时的形式,即低 16 位等于 0x330E。那种形式的内部 PRNG 状态每 65,536 步会出现一次,所以仅凭达到其中一个并不能构成证据。
然而,对于那十个素数曲线种子,每一次 srand48 初始化都是一个 Unix 时间戳,表示 1997 年 5 月至 1998 年 4 月之间的某个日期。它们使用的是由 Unix 时间戳作为种子的弱 PRNG。那四个二进制曲线初始化读作 1984 年 2 月。将时间戳翻倍后,它们对应到 1998 年 4 月 17 日,即 P-224 运行两周之后。所以,该程序可能将时钟减半了。
Claude当时的内部思考是:
Claude也发现了一些基础点
但是等等,还有更多……每条曲线还附带一个基点 G,即每个 ECDSA 公钥都是其倍数的固定点。上面找到的种子并不能决定这个 G,因此另一个问题随之产生:这些基点是如何生成的?
在检查种子时,Claude 还发现了某些基点的来源。1997 年 5 月生成的六条曲线(P-192 以及五条 ANSI X9.62 示例曲线 prime192v2、prime192v3 和 prime239v1 至 v3)的基点来自 FreeLIP 中的随机数生成器,即 Arjen Lenstra 的长整数算术软件包。Victor Shoup 的 NTL 库的早期版本附带了相同的代码。
这里的食谱很简单:
用一个小整数作为生成器的种子。
丢弃七个输出。
从对 p 取模化简后的26位输出生成候选 x 坐标。
重复第3步,直到x在曲线上。
Claude 发现,生成元种子分别是:P-192 为 20000,prime239v1 到 v3 为 20420、20507 和 20509,prime192v2 和 v3 为 20512 和 20517。

据我们所知,此前没有任何 NIST 基点得到过解释。P-224、P-256、P-384 和 P-521 的基点不符合这一配方;我们无法解释它们是如何被选定的。
Open questions
并非每个 20 字节候选种子都能生成可用曲线,而且我们观察到一些潜在可用的曲线被跳过了。对于 P-256,公布的种子是候选 1842,但同一次运行中的候选 876 也能给出一条大小正确的素数阶曲线,并且其参数以与已发布曲线相同的方式选择。P-224 的那次运行跳过了三条这样的曲线,而 ANSI X9.62 示例曲线背后的两次运行又跳过了七条(见图)。我们不知道可能使用了什么标准,也不知道这是否是一个无意的产物。


由于被跳过的候选曲线数量很少,我们不认为弱化曲线被选中是合理的。那将意味着弱化曲线很常见且容易找到。仍然可以想象,原则上可以通过搜索提供给随机数生成器的时间戳,来选中这些曲线以使其具有某种特定属性。然而,只有当你打算披露该时间戳,作为种子是无害地生成的某种证据时,你才需要这样做。这些数字中没有任何内容表明进行了多少次运行。
还有一颗种子我们无法找回。第五个二进制种子 B-163 与 Claude 尝试过的任何东西都不匹配,仍然无法解释。最后,我们不知道 P-224、P-256、P-384 和 P-521 的基点是如何生成的。NIST 二进制曲线也是如此。
发现这些种子所得的 36,864 美元将捐赠给互联网安全研究小组。
这项工作由John Wood、Henry de Valence、Ava Howell、Zack Voase、Lucy Sweet、Amir Omidi、Paul Crowley、Iain McGinniss、Nicholas Carlini和Steve Weis在Anthropic完成。
致谢
我们想追念并表彰 Jerry Solinas,他以良好的幽默感接受了被贴上“邪恶的互联网迷因”和“NSA 妖魔中的 Yo La Tengo”的标签。还要感谢 Filippo Valsorda 组织了 NIST 椭圆曲线种子赏金活动。
复现这些种子的代码
这段代码的输出:
用于重现所选基点的代码
这段代码的输出:
在法律允许的最大范围内,作者已放弃本页面代码的所有版权及相关或邻接权利,并根据 CC0 1.0 通用(https://creativecommons.org/publicdomain/zero/1.0/)将其奉献给公有领域。
相关内容
用 Claude 设计更高效的量子电路
我们向 Claude 提供了八个量子电路的自然语言规格,以及一个自动化评估器来检查和评分其设计。Claude 在很大程度上独立工作,改进了已发表的最佳电路,在某些情况下提升了一个数量级甚至更多,这可能使实用量子计算机比之前预期更近一步。
AI 模型或许能够在没有数据中心访问权限的情况下自我复制
我们的实验表明,小型 AI 模型可能只需再过几个月,就有能力在商用物联网设备(如 Android 电视和智能烤箱)上自我复制。
加强对蒸馏攻击的防御
非法蒸馏使模型开发者能够复制前沿 AI 能力,而无需建立与之相称的稳健防护措施。在此,我们描述了我们如何将蒸馏率降低了 90% 以上。