AREX Feed Article
Anthropic 称 Claude 半小时内推算出 NIST 五条素数曲线种子来源:lrand48 加 Unix 时间戳
Anthropic 在 10 月 16 日发布的研究博文中称,其内部的一个研究模型在不到半小时内算出了 NIST 五条椭圆曲线种子的来历:P-192、P-224、P-256、P-384 与 P-521 的种子不是任何哈希算法的结果,而是 C 库伪随机数生成器 lrand48 的输出,该生成器以一个 Unix 时间戳初始化。以 P-256 为例,那一轮生成启动于 1997 年 8 月 16 日 01:52:34 UTC,标准里的种子是第 1,842 个候选。
博文附了复现代码。把博文给出的时间戳与迭代次数代入这段代码,五条 NIST 素数曲线的输出与 Filippo Valsorda 2023 年上列出的种子逐字符一致,P-256 也确实停在第 1,842 个候选。复算能确认种子与这套算法吻合;至于 Anthropic 由此得出的判断——这些曲线被蓄意植入后门的可能性因此大减——则属于博文自己的结论。
种子公开了二十多年,来历一直是空白
椭圆曲线数字签名算法(ECDSA)在 2000 年被 NIST 纳入 FIPS 186-2 数字签名标准,其中列出了一组不同位长的标准曲线。按 ANSI X9.62 的做法,每条曲线公开一个 seed 参数,seed 的哈希值用来推导曲线方程里的系数 b。问题出在 seed 本身:它们由 NSA 提供,没有附带任何生成说明。博文举的例子是 P-256 的种子 C49D3608 86E70493 6A6678E1 139D26B7 819F7E90——一串看不出出处的十六进制。
二十多年里,这串数字的出处一直是悬案。Neal Koblitz 与 Alfred Menezes 写过一篇综述讨论这段历史和围绕它的担忧,也有人做过业余追查。博文提到的一种说法来自长期在 NSA 工作的 Jerry Solinas:种子是某句玩笑话的哈希,内容大致是「给 Bob 和 Jerry 加薪」之类,代码由 Bob Reiter 写,细节两人都记不清了。Solinas 于 2023 年去世,这条线索随之断掉。
2023 年 10 月,Filippo Valsorda 发起 NIST 椭圆曲线种子悬赏,与多位出资人凑出 12,288 美元,若获奖者把钱捐给慈善机构则翻三倍到 36,864 美元。悬赏的任务是把这五个种子当作哈希来破解,找出生成它们的英文句子。Valsorda 在悬赏页里把外界的怀疑追溯到 NSA 在 Dual_EC_DRBG 上的先例,同时引用 Koblitz 与 Menezes 的论证,认为后门假设站不住。
半小时、34 种组合,和一个最高位全为零的模式
2026 年 10 月,一名 Anthropic 员工把这个问题交给一个内部研究模型,没有给出「哈希」这条线索。博文题名把发现归于 Claude,正文先称「一个内部研究模型」,随后直接用 Claude 指代。博文说,此前已有数名 Anthropic 员工沿着「玩笑话的哈希」这条提示追过种子,都没有结果。
不到半小时,模型给出了答案。它换了个角度,先猜生成软件长什么样:1990 年代的 C 库里自带伪随机数生成器,这些生成器足够弱,弱到输出可以被认出来。它写了一个扫描器,沿着每个已发布种子逐位滑动,检查相邻的字节块是不是某个老式生成器的连续输出,一共试了 34 种「生成器 + 输出切片」的组合。
然后它注意到一个用眼睛也能看出的模式:有些种子的最高位全是 0。把五条 NIST 素数曲线和五条二进制曲线的十个种子各写成五个 32 位 word(字),其中四条二进制曲线的 20 个 word 最高位全部为零。博文称,这种模式若纯属偶然,出现概率为 1/5,810。
这正是 lrand48 的指纹:它每次只返回 48 位状态里的高 31 位,所以 32 位 word 的最高位永远是 0。
博文还引了一段模型当时的内部推理:「这太惊人了:它解开了 25 年的谜团。嗯,等等。让我保持怀疑:我是不是处在某种模拟/测试环境里?」它接着自问这个结果在现实中是否说得通,核对了记忆中的种子数值,最后判断「这是一个真实的发现」。
从 48 位状态倒推回 1997 年的时钟
lrand48 的状态是一个 48 位整数,每步按 x ← (0x5DEECE66D · x + 0xB) mod 2⁴⁸ 递推。要复现种子,得先把状态找回来。
二进制曲线的种子里,每个 32 位 word 只暴露 31 位,藏起 17 位。Claude 取第一个 word,把 2¹⁷ = 131,072 种可能全试一遍,再用后四个 word 验证,四条曲线都对上了。
素数曲线留下的线索更少。它们同样出自 lrand48,但每次只保留 8 位(lrand48() >> 23),一个 48 位状态里有 40 位看不到。博文说,从截断的线性同余生成器里恢复状态是教科书级的格问题,用 Lenstra–Lenstra–Lovász(LLL)格基约化算法可解;Claude 不知道种子会露出哪几位,就把所有窗口都跑了一遍。五条 NIST 素数曲线和五条 ANSI X9.62 曲线呈现同一种模式,每个恢复出的 48 位状态都能重新生成完整的 160 位种子,博文称这无法用巧合解释。
再往回倒:这个生成器正着跑和反着跑一样容易。Claude 把状态一步步退回 srand48 初始化的形态——低 16 位等于 0x330E——这种形态每 65,536 步才出现一次,单看并不构成证据。但十条素数曲线种子的初始化状态,读出来都是 1997 年 5 月到 1998 年 4 月之间的 Unix 时间戳。
四条二进制曲线的初始化状态读出来是 1984 年 2 月;把时间戳乘二,对应 1998 年 4 月 17 日,比 P-224 那一轮的 1998 年 4 月 3 日晚两周。博文推测,程序可能把时钟除以了 2。
Anthropic 的判断:不是破解,但后门说法更难成立
博文在开头就把边界写清楚了:这不是密码学破解,不是新的攻击,也没有在这些曲线上发现弱点。它要处理的是另一个问题——种子来历不明,本身就是怀疑的来源。
按博文的说法,种子由「一个从时钟初始化的常见伪随机数生成器」产生,任何人都能复现,「留给颠覆的空间小得多」,因此他们更有信心这些曲线在被挑选时没有后门或刻意弱点。博文也提醒,多数研究者本来就信任这些曲线,读者应当把它当作一个有趣的收尾,没有需要改变的做法。
复现种子只能确认生成过程,不能证明曲线上没有后门;博文的结论是这种可能性大减,并非排除。
基点、B-163 与被跳过的「好曲线」
博文列出的未解问题里,首先是基点。每条曲线还有一个基点 G,所有 ECDSA 公钥都是它的倍数,而种子并不决定 G。Claude 顺带发现,1997 年 5 月生成的那六条曲线——P-192 加上 ANSI X9.62 的 prime192v2、prime192v3 与 prime239v1~v3——基点来自 FreeLIP,即 Arjen Lenstra 的长整数运算库,早期版本的 Victor Shoup 的 NTL 库也带同一段代码。配方是:用小整数给生成器播种,丢掉七个输出,再用 26 位输出对 p 取模生成候选 x 坐标,直到落在曲线上。六条曲线对应的生成器种子分别是 20000、20420、20507、20509、20512、20517。博文称,据其所知,此前没有人解释过任何一个 NIST 基点。
但 P-224、P-256、P-384、P-521 的基点不符合这套配方,博文没能解释它们是怎么选出来的。
然后是那些被跳过的候选。P-256 那一轮里,第 876 个候选同样能生成一条阶为素数、参数选择方式与公开曲线相同的曲线,但公开种子取自第 1,842 个;P-224 那一轮跳过了三条这样的曲线,ANSI X9.62 的两轮又跳过了七条。博文说,不知道当时用什么标准筛选,也不确定这是不是无意的副产品。
Anthropic 认为这不构成后门证据:被跳过的候选数量很少,如果靠这种方式挑出弱曲线,就意味着弱曲线既常见又好找。
最后是 B-163。它的种子对不上 Claude 试过的任何组合,至今没有解释。
36,864 美元捐给 ISRG,以及仍未排除的一种可能
博文末尾给出了赏金的去向:找到种子的 36,864 美元将捐给 Internet Security Research Group。这个数字等于 Valsorda 悬赏页设定的三倍金额——12,288 美元在获奖者选择捐给慈善机构时翻三倍。悬赏页的出资人名单里有 Amir Omidi 和 Steve Weis,两人也在博文的十位作者之列。博文把两段复现代码以 CC0 协议放入公有领域。
博文没有排除另一种可能:这些曲线是靠在时间戳上搜索、挑出具有某种特定性质的种子得到的。作者写道,这么做的前提是把时间戳公开,当作「种子系无辜生成」的证据。「数字里没有任何东西显示当时跑了多少轮。」