C49D3608 86E70493 6A6678E1 139D26B7 819F7E90
上面这串 160 位字符,是保障全球网络安全的曲线 P-256 核心种子参数。2026 年 10 月 15 日,Filippo Valsorda 悬出的 36864 美元赏金被 Anthropic 的一组研究员领走。困扰密码学界 25 年的种子之谜,被他们的内部研究模型 Claude 在半小时内解开。奖金全额捐给了公益组织 ISRG。
这起突破的价值在于换了一个假设空间。学界长期认定种子来自某句绝密口令的哈希,方向一错二十多年。研究模型改从生成器的行为特征下手,用 10 组种子共 1600 位的重放数据给出数学上的终局。
25 年都查错了方向
2000 年,NIST 在 FIPS 186-2 标准中采纳了 ECDSA 曲线。标准包含 P-192 到 P-521 等五条素数曲线。每条曲线都附带一个十六进制种子值。算法需对种子计算哈希来生成参数。由 NSA 提交的这批关键种子,发布时没有附带推导说明。缺少生成记录的黑盒状态,迅速在学界引发了信任危机。
此后流传最广的传闻,指向了 NSA 研究员 Jerry Solinas。传言认为 Solinas 使用了幽默英文口令,并对其计算 SHA-1 哈希来生成种子。随着 Solinas 在 2023 年去世,这条口耳相传的线索失去了查证源头。学界耗费了大量算力去穷举词组,试图撞出匹配的哈希前缀。这种排查把宝贵时间消耗在了无依据的盲盒中。
缺乏透明度引发的后门疑云,随着时间推移愈发沉重。2015 年,学者 Neal Koblitz 与 Alfred Menezes 系统梳理了围绕这批种子的怀疑史。2017 年,密码学家 Daniel Bernstein 与 Tanja Lange 指出,种子选取过程包含约 70 位的自由度。理论上,这足以用来挑选特定的弱曲线。后门怀疑论在十余年间持续发酵,削弱了工业界对标准加密组件的信心。
为给这桩历史包袱一个了断,独立研究员 Filippo Valsorda 发起 36864 美元的社区悬赏。他自己在台湾的全家便利店凑了 20 颗骰子,印上「Geomys FIPS 140-3 熵源」当周边,用一次 6^20 约 51.7 bit 的物理熵调侃标准种子的神秘主义。代码一天不重放出来,社区对标准体系的怀疑就一天不会消解。
图:台湾全家便利店里买到的 20 颗骰子,一次掷出 6^20 有约 51.7 bit 熵。来源:Filippo Valsorda
半小时倒推:种子出自 1997 年时钟
2026 年 10 月,Anthropic 员工向研究模型 Claude 提交了这道未解之谜。提示词没有提供任何线索,只要求它从零推导种子来源。出乎预料,模型在半小时内便找出了答案。解题效率的质变,源于它将分析重心放在了生成器行为特征的比对上。
Claude 编写了一个自动化扫描程序。该程序测试了 34 种生成器与输出切片组合。在比对字节结构时,模型捕捉到了反常的统计指纹。当把 10 个公开种子切分成 5 个 32 位整型字时,其中 4 个种子的全部 20 个字最高位均为 0。在均匀随机分布的字节串中,出现这种特征的概率仅为 1/5810。这种偏置不可能是巧合,只能来自生成算法的结构。
这个统计特征指向了 1990 年代广泛内置于 Unix C 标准库的 lrand48() 函数。该函数维护 48 位的内部状态,但单次调用只返回高 31 位。由于返回值的高位被固定补 0,它在序列中留下了清晰的签名。恢复单步内部状态只需要枚举未公开的 17 个低位。这使得搜索空间缩小为 131072 种可能。
面对截断特征更加复杂的素数曲线种子,模型现场构建了格基约减求解器。截断线性同余生成器的状态恢复属于标准的格问题。模型对不同截断窗口逐一执行了基约减运算。计算结果显示,10 个种子全部遵从 lrand48() >> 23 的截断模式。每个恢复出的 48 位内部状态,均能精确重放出对应种子完整的 160 位数据。
图:部分种子的最高位全为 0,这是 lrand48 只返回 48 位状态高 31 位的签名,随机出现概率 1/5810。来源:Anthropic
1600 位状态全部重放成功
线性同余生成器的状态转移具备双向对称性。确定了内部状态后,模型沿着递推公式逆向回退计算步骤。在倒推过程中,算法寻找符合 srand48(t) 初始化规范的状态点。该状态的低 16 位必须固定等于十六进制的 0x330E。这一逆向追溯把无序的字节流,重新锚定回了物理世界的时间轴上。
逆推结果给出了精确的历史时钟读数。10 个素数曲线种子的初始化时间戳,全部集中在 1997 年 5 月至 1998 年 4 月之间。其中最为核心的 P-256 种子,对应的时间戳是 1997 年 8 月 16 日 01:52:34 UTC。生成程序在初始化后按每 20 字节一批抽取候选。P-256 正好落在第 1842 个候选位置。连续 1842 次迭代的确定性重放,排除了巧合碰撞的可能。
在处理 4 个二进制曲线种子时,模型遭遇了一处年代错位。逆推得到的初始时间戳落在 1984 年 2 月。模型分析发现,将该数值直接翻倍后,时间恰好落入 1998 年 4 月 17 日。这个时间点与 P-224 种子生成时间仅相隔两周。工程师在编写生成脚本时,大概率误将系统时间除以了 2。
重放实验取得了无可争议的验证结果。10 组种子共 1600 位的测试数据,全部与当年的运行输出吻合。在推理日志中,Claude 甚至记录下了自我怀疑的片刻。它一度推测自己是否身处某种预设的测试沙盒中。随后模型通过十组状态的全局重合概率完成了确认。弱随机数发生器的时钟播种流程被证实。这几乎没有预留人为操纵的空间。
图:种子生成机制示意:每次迭代从 RNG 抽 20 字节作为候选种子,P-256 走到第 1842 个候选才得到标准值。来源:Anthropic
基点来源部分解开,候选跳过判据仍空白
在解开种子的同时,基点推导机制也迎来了局部突破。分析显示,1997 年 5 月生成的六条椭圆曲线基点均来自长整数计算包 FreeLIP。这个由密码学家 Arjen Lenstra 开发的工具包,在当时被广泛集成进早期 NTL 算法库。P-192 曲线使用的基点生成种子为 20000。而 ANSI 标准下的几条曲线则分别使用了 20420 和 20507 等离散数值。
历史工程细节中,依然残留着尚未厘清的技术断层。B-163 曲线的种子来源至今未能重现。P-224、P-256 等核心曲线的基点生成规则也仍未解开。此外,生成脚本存在跳过合格曲线的现象。P-256 的第 876 个候选原本就满足了要求。但脚本却跳过了它,一路推进到第 1842 个候选。
针对跳过候选的现象,密码学界长期存在两种截然不同的解读。支持后门论的研究者指出,放弃候选意味着生成者可能在规避某些参数。他们怀疑其中暗中挑选了弱曲线。工程阵营则认为,跳过候选更可能源于早期未公开的性能优化筛选。例如排除计算开销较大的参数形式。在当年简陋的工程环境下,临时增加的过滤条件往往不会被写入文档。
这些留白不影响核心结论。即便基点选择的动机仍待深究,1600 位随机数序列与 Unix 时间戳的吻合,已经大幅挤压了人为预置后门的空间。
模型当假设生成器
回顾整个破译过程,所需的数学工具并不深奥。格基约减与状态回溯早已写入教科书。人类研究者难以突破,症结在于假设模型背离了事实。学界长期认定神秘种子出自高强度哈希。现成的数学工具因而找不到发力点。
大模型的核心优势,在于探索未知问题时对假设空间的拓宽能力。它不具备人类对 Jerry Solinas 玩笑传言的情感执念。这让它能够不受拘束地构建测试矩阵。模型将 1990 年代粗糙的系统实现列为独立候选。它利用脚本快速验证,把漫无边际的猜想收敛成了高置信度的结论。
这种能力勾勒出大语言模型在科研场景中的现实定位。模型无需凭空创造未知的数学定理。其关键价值在于承担起假设生成器与自动化扫描器的职能。它在短时间内遍历冷门分支。测试脚本直接固化了验证结果。
NIST 椭圆曲线的种子之谜到此画上句号。真正卡住从业者二十多年的,是一开始就被锁死的假设。机器没有对 Solinas 传闻的情感执念,于是把 1990 年代粗糙的系统实现当成了正经候选。这一步跳跃比任何数学技巧都值钱。
参考链接:
- Anthropic: Finding the origin of the NIST elliptic curves
- Filippo Valsorda: The 36 Ki$ ECDSA seed bounty(悬赏认领与技术细节)