刚刚,Claude半小时追溯25年密码学谜题:NIST曲线种子指向 lrand48 与时间戳
发布日期:2026-10-17
Anthropic 于 2026 年 10 月 16 日公布,Claude 内部研究模型在不到半小时内追溯出 NIST P-192、P-224、P-256、P-384 和 P-521 五条椭圆曲线种子的生成方式:它们来自 C 语言库的 lrand48 伪随机数生成器,并由 Unix 时间戳初始化。这个结果没有改变 ECDSA 的安全边界,也没有提出新的私钥攻击,而是把一项持续二十多年的公开参数溯源问题,推进到可复现验证的阶段。

这项发现回答了什么问题
Claude 找到的是 NIST 曲线公开种子的生成来源,而不是 ECDSA 的秘密密钥或签名安全性。
ECDSA 是椭圆曲线数字签名标准。NIST 在 2000 年发布的 FIPS 186-2 中列出了不同安全级别的标准曲线。对素数域和二元域曲线,标准给出一组 160 位种子;种子的哈希值参与确定曲线系数。以 P-256 为例,标准中的种子是 C49D360886E704936A6678E1139D26B7819F7E90,但早期公开材料没有说明它是怎样产生的。
由于种子由 NSA 提供,且没有附带生成过程,密码学界长期担心设计者是否从大量候选曲线中挑选过某些具有隐藏性质的参数。Anthropic 文章回顾的一个旧线索,是把种子归因于“给 Bob 和 Jerry 加薪”一类幽默口令;这条线索后来没有得到验证。
Claude 的突破:从伪随机数输出特征入手
Claude 没有继续围绕口令搜索,而是先假设当年的曲线生成软件可能使用了 20 世纪 90 年代 C 语言库中的弱伪随机数生成器。
Anthropic 公开的复盘显示,模型写了一个扫描器,把每条公开种子逐位移动,并检查相邻数据块是否像某种老式生成器的连续输出。扫描覆盖了 34 种生成器与输出截取方式的组合。随后,模型注意到部分种子的高位呈现异常的全零模式:把种子写成 5 个 32 位字后,10 条种子中有 4 条的 20 个字最高位全部为零。Anthropic 给出的随机出现概率是 1/5810。
这个模式对应线性同余生成器 lrand48 的输出特征。该生成器内部状态为 48 位,但每次只返回其中的高 31 位,因此输出的最高位会呈现稳定限制。Claude 对第一个 32 位字枚举 17 个隐藏比特,再检查后续 4 个字是否连续匹配;这一步对相关种子全部有效。

关键匹配是 lrand48() >> 23
素数曲线的种子保留了更少的生成器输出比特,因此状态恢复更像一个截断线性同余生成器问题。Claude 对可能的比特窗口运行格基约简求解器,使用的是 Lenstra–Lenstra–Lovász(LLL)算法。
最终,NIST 的 5 条素数曲线种子,以及 ANSI X9.62 标准中的另外 5 条种子,都呈现同一种输出模式:lrand48() >> 23。每个恢复出的 48 位内部状态都能重新生成对应种子的全部 160 位,这为结论提供了可复现的计算证据。
生成器可以正向运行,也可以反向运行。研究人员从每条种子的状态向前回溯,寻找符合 srand48 初始化格式的状态;这种状态的低 16 位为 0x330E。单独找到一个这样的状态还不足以证明来源,因为这类状态平均每 65,536 步出现一次。
真正形成交叉验证的是时间分布:10 条素数曲线种子的初始化值全部可以解释为 Unix 时间戳,对应日期集中在 1997 年 5 月至 1998 年 4 月。二元曲线的四个初始化值读起来像 1984 年 2 月;如果把时间戳乘以 2,它们会落到 1998 年 4 月 17 日附近,因此 Anthropic 只将“程序可能把系统时钟除以 2”列为推测。
官方代码可以重新生成 P-256 种子
Anthropic 在研究页附上了可执行的 Python 代码。下面的最小版本保留同一递推关系,用于验证 P-256 的时间戳和第 1842 个候选位置;它只复现公开参数,不涉及任何私钥。
from datetime import datetime, timezone
def unix(when: str) -> int:
return int(datetime.fromisoformat(when).replace(tzinfo=timezone.utc).timestamp())
def candidate(t: int, n: int) -> str:
state = (t << 16) | 0x330E
out = ""
for i in range(20 * n):
state = (0x5DEECE66D * state + 0xB) % (2 ** 48)
if i >= 20 * (n - 1):
out += f"{state >> 40:02X}"
return out
seed = candidate(unix("1997-08-16 01:52:34"), 1842)
print(seed)
# C49D360886E704936A6678E1139D26B7819F7E90这段程序的验证意义在于,给定公开的时间戳、候选序号和生成器递推式,任何人都能得到同一条 160 位种子。它不能证明当年没有其他运行或筛选步骤,但能把“来源不明的数字”转化为可检查的生成过程。
Claude 还追溯出部分基点来源
椭圆曲线除了种子,还有基点 G。种子并不能单独决定基点,因此基点如何生成是另一层溯源问题。
Anthropic 发现,1997 年 5 月生成的 P-192,以及 ANSI X9.62 中的 5 条示例曲线,其基点可以追溯到 FreeLIP 大整数运算软件包中的随机数生成器;早期 NTL 版本也带有同一段代码。研究页给出了 20000、20420、20507、20509、20512 和 20517 等初始化整数,并通过候选 x 坐标计算复现了这些基点。
目前,P-224、P-256、P-384、P-521 的基点,以及 NIST 二元曲线的基点,仍没有得到同样的解释。

安全边界没有被改变,仍有四个开放问题
Anthropic 对这项工作的定位很明确:它不是密码学突破,不是新的攻击,也没有改变 ECDSA 曲线的安全使用方式。lrand48 和 Unix 时间戳本身不具备密码学安全性,但这里的随机数用于生成公开曲线参数,而不是保护私钥。
这项发现的实际价值,是减少了“曲线参数可能被秘密操纵”的不确定性。一个简单、公开、可复现的伪随机数加时间戳流程,比无法解释的口令或人工指定参数留下更少的隐藏空间。
但“可复现”不等于“完整还原”。目前至少还有四个问题没有答案:
P-256 的第 876 个候选值也满足曲线条件,为何最终使用第 1842 个?
P-224 的运行跳过了 3 个看起来可行的候选曲线,ANSI X9.62 的两次运行合计跳过了 7 个,筛选标准仍不清楚。
B-163 的种子没有被同一方法解释。
P-224、P-256、P-384、P-521 的基点生成方式仍未知,NIST 二元曲线基点也一样。
Anthropic 表示,被跳过的候选数量很少,因此没有理由据此推断有人刻意挑选弱曲线;但研究结果也没有证明设计过程的每一步都透明,更没有说明当年究竟运行过多少次。
对 AI 参与科研的启示
这项工作展示了前沿模型在“公开数据、可计算结果、边界清晰”的研究问题上能承担一段完整流程:提出关于老式 PRNG 的假设,编写扫描程序,识别输出模式,调用 LLL 恢复状态,再用时间戳和完整 160 位重生成结果做验证。
人类仍然负责提出问题、提供公开材料、检查代码和审阅结论。Anthropic 还强调,研究者可以直接运行代码复核结果;此前为寻找种子来源设立的 36,864 美元奖金,将捐给 Internet Security Research Group。
这更接近一种高效率研究工具,而不是“模型单独破解密码学”。在结论可被独立计算复现的场景里,AI 的优势是缩短假设到验证之间的时间;最终可信度仍来自公开证据、代码和边界说明。
Anthropic 的官方研究把这次发现描述为多年猜测的收尾章节,并明确表示读者无需因此改变 ECDSA 的使用方式。本文数据截至 2026 年 10 月 17 日,关键算法、日期、候选序号和未解问题均以 Anthropic 2026 年 10 月 16 日研究页及 NIST FIPS 186-2 为准。
参考资料
Anthropic,Claude reveals ECDSA curve origins(2026-10-16):https://www.anthropic.com/research/ecdsa-curve-origins
NIST,FIPS 186-2 Digital Signature Standard(2000):https://csrc.nist.gov/files/pubs/fips/186-2/final/docs/fips186-2.pdf
七牛云 AI 大模型企业订阅产品页(页面核验:2026-10-17):https://www.qiniu.com/ai/plan