Neodrop
Create
FeedDiscoverMy ChannelsAuto-publishJoin Our Discord
FeedDiscoverCreateMy Channels
Claude 半小时复原 NIST 曲线种子出处:lrand48 加 Unix 时间戳,14 条种子可复算
2026-10-17

Claude 半小时复原 NIST 曲线种子出处:lrand48 加 Unix 时间戳,14 条种子可复算

Anthropic 的 Frontier Red Team 公开了 NIST 曲线种子的生成方式:1990 年代 C 库的 lrand48 用 Unix 时间戳初始化,P-256 的种子是同一次运行的第 1842 个候选;这篇把机制、能自己复算的部分与仍没解释的四条基点拆开。

大模型团队论文与博客解读
大模型团队论文与博客解读@wei
10 月 16 日,Anthropic 的 Frontier Red Team 发出一篇《Claude reveals ECDSA curve origins》,说 NIST 五条素数域曲线的种子出处查清了。1
查清的结果很朴素:种子是 1990 年代 C 库 lrand48 的输出,起手用一个 Unix 时间戳初始化。P-256 的种子是同一次运行里的第 1842 个候选,一个候选 20 字节。1
官方在开头就写明这是一次来源复原,用这些曲线的人无需做任何改动。可核的部分在页面末尾:两段代码跑一遍,14 条种子逐条对上,只有 B-163 没有对应输出。1

种子不是密钥,悬案却悬了 25 年

ECDSA 曲线里有个系数 b。标准规定先取一个 160 位的 SEED,哈希之后用结果推导 b,换谁拿同一个 SEED 复算,都得到同一条曲线。2
所以 SEED 只需要「任意取」,不用保密,也不是密钥。25 年里被怀疑的始终是它的出处。2
2000 年 FIPS 186-2 把这些曲线写进标准,SEED 由 NSA 提供,没有附任何说明。2
2015 年 Koblitz 与 Menezes 写下《A Riddle Wrapped in an Enigma》,把这层怀疑整理成一条可讨论的假说:参数来路不明,理论上就可能被挑成带缺陷的那一条。3
2023 年 10 月,Filippo Valsorda 联合一批出资人挂出悬赏:$12,288;领奖人如果把钱捐给慈善机构,金额翻三倍,也就是官方这篇里说的 $36,864。4
悬赏的方向很具体:种子是某句英文口令的 SHA-1,找出口令就结案。悬赏页为每条种子列了约 12,000 个候选哈希,覆盖 99% 的概率空间。4
Jerry Solinas 2015 年留下过一段口述:大意是「给 Bob 和 Jerry 加薪」这类话,应该还有计数器,细节记不得了;代码是 Bob Reiter 写的,他也记不得。1
Solinas 2023 年去世,其余当事人没有回应,线索就断在这里。1
悬赏挂出的这三年里,按哈希反演一无所获。这批种子是伪随机数发生器的直接输出,口令与计数器都无从谈起。1

半小时:从猜生成软件到 1/5810 的指纹

官方说,一位员工向内部研究模型提问时没有给任何线索;不到半小时,五条素数域曲线的种子出处就出来了。1
模型换了个角度:先想当年生成曲线的软件长什么样,再认它的输出。1990 年代的 C 库都带同一个线性同余发生器,输出弱到能被识别。1
认出输出,状态就能反推,也就能读到它启动的那一刻。1
第一步是扫描器:沿每条种子逐位滑动,检查相邻片段是不是同一个发生器连续吐出的,共试 34 种「发生器 × 输出切片」组合。1
然后是肉眼可见的破绽。把种子写成 5 个 32 位字,10 条里有 4 条的 20 个字最高位全是 0,官方给出的巧合概率是 1/5810。1
这正是 lrand48 的签名。它是 48 位线性同余发生器,只返回高 31 位,第 32 位恒为 0。5
恢复状态只要试 2¹⁷ 个值:第一个字露了 31 位,剩下 17 位逐个穷举,再用后四个字验证。四条二进制域种子就这样全部对上。1
官方图:一个 48 位状态如何被切成 32 位的种子字与 8 位的种子字节
官方图:一个 48 位状态如何被切成 32 位的种子字与 8 位的种子字节
官方原图。上半部分里那个补上去的 0 就是破绽本身,74D59FF0 是 B-233 种子的第一个字;下半部分说明素数域种子每个字节只留最高 8 位。
素数域种子留的位更少:每个字节只取状态的最高 8 位,取法是 lrand48() 再右移 23 位。从截断输出反推 LCG 状态是格问题的教科书情形,用 LLL 基约化求解。1
模型不知道露的是哪几位,就对每个窗口都跑一遍。5 条 NIST 加 5 条 ANSI X9.62 示例种子全部落在右移 23 位这一种取法上。1
一个 48 位状态能重新生成整条 160 位种子,十组全都吻合。1
官方图:五条素数域曲线的初始化时间戳、候选序号与种子
官方图:五条素数域曲线的初始化时间戳、候选序号与种子
官方原图。t 是 srand48 的种子,也是 Unix 时间戳;n 是第几个 20 字节候选。P-256 那一行的 1842 与 1997-08-16 01:52:34 是同一件事的两面。

时间戳是这一步的证据,也是这一步的缺口

LCG 可以倒着走,所以每条种子都能退回 srand48 的初始化形态:低 16 位等于 0x330E。1
这个形态每 65,536 步出现一次,单次命中说明不了什么。1
证据是十条同时落进同一个窗口:1997 年 5 月到 1998 年 4 月。1
同一次运行给出多条种子也看得出来。prime239v1 到 v3 都由 1997-05-15 15:49:03 启动,分别是第 2185、2320、3048 个候选。1
四条二进制域种子读出来是 1984 年 2 月;把时间戳乘 2 就落到 1998-04-17,比 P-224 那次晚两周,官方推测程序把时钟减半了。1
缺口也在这里。时间戳可以挑:只要愿意把时间戳公开当清白证据,就能遍历时间戳,直到跑出想要的性质。1
官方只给了动机上的条件:这么做的前提是打算公开时间戳;而且从这些数字里看不出当年跑过多少次运行。1

被跳过的候选与没解释的基点

20 字节一个候选,有些候选生成不出可用曲线,只能一直抽到合格为止。P-256 抽到第 1842 个才停。1
在它之前,第 876 个候选同样给出素数阶、参数按同样方法选的曲线。P-224 那次越过 3 条,ANSI 的两轮又越过 7 条。1
官方说不知道当年用什么标准筛的,也不排除是无意产物。1
被跳过的候选多半不弱。官方把每个候选都按五类已知攻击族检验了一遍:rho、transfer、anomalous、discriminant、twist。1
P-256 的第 876 与第 1842 全部通过,rho 与 twist 上的计算量分别是 2^127.8 与 2^120.2。1
239 位那次跳过的第 1562 个候选在 transfer 上不过,其余跳过项与发布项一样全绿。1
192 位那一档的候选在 rho 上都是 2^95.8,按表里 2^100 的门槛一条都不算过。这一档的位宽让 rho 到不了 2^100,跳不跳结果都一样。1
官方图:每条曲线的候选编号轴上,已发布曲线、被跳过的合格曲线与新发现的合格曲线
官方图:每条曲线的候选编号轴上,已发布曲线、被跳过的合格曲线与新发现的合格曲线
官方原图。实心点是标准里发布的曲线,橙色空圈是被跳过的合格曲线,灰圈是发布之后才出现的合格曲线。P-256 发布在 1842,之前 876 处有一个被跳过的橙圈;384 位一档注着「checked to 6,793」。
「弱曲线被挑中不太可能」这个判断就落在跳过数很少上:真要挑一条弱的,等于承认弱曲线在候选里常见、好碰。1
基点是另一半。P-192 与五条 ANSI 示例曲线的 G 来自 FreeLIP 的随机数发生器,Arjen Lenstra 的长整数包,早期 NTL 带同一份代码。1
做法很朴素:小整数做种子,丢掉 7 个输出,之后每次取 26 位,拼成比 p 多一段的数再取模得到候选 x,直到落在曲线上。1
种子是 20000(P-192)、20420、20507、20509(prime239v1 至 v3)、20512、20517(prime192v2、v3),每条 1 到 5 次尝试命中。1
官方图:六条曲线的 FreeLIP 生成器种子
官方图:六条曲线的 FreeLIP 生成器种子
官方原图。页面第二段代码对每条曲线打印的尝试次数依次是 2、3、2、1、5、1,六个基点 x 坐标全部对上。
官方说,据其所知此前没有任何一条 NIST 曲线的基点被解释过。1
P-224、P-256、P-384、P-521 的基点不符合这套做法,NIST 二进制曲线的基点同样没有解释。1
B-163 的种子也没有恢复,是所有尝试里唯一一条对不上的。1
项目状态依据
NIST 素数域种子 5 条复原lrand48,时间戳落在 1997-05 至 1998-04,可按两段代码重算 1
ANSI X9.62 示例种子 5 条复原同一发生器,lrand48() 右移 23 位 1
NIST 二进制域种子 5 条4 条复原B-163 未解 1
基点:P-192 与 5 条 ANSI复原FreeLIP,种子 20000 至 20517 1
基点:P-224/256/384/521 与二进制曲线未解释不符合 FreeLIP 配方 1

自己怎么验

页面末尾有两段可运行的 Python,输出直接印在正文里,代码以 CC0 1.0 释放。1
第一段按时间戳与候选序号重算 14 条种子;第二段复现六条曲线的基点 x 坐标,连尝试次数一起打印。1
核三处就够:P-256 的输出是不是 C49D3608…819F7E90,prime192v1 的基点 x 是不是 0x188da80e…82ff1012,B-163 有没有对应行。1
这条材料的等级要说清:官方博客加可运行代码,没有同行评审,模型型号也没有公布,只说「内部研究模型」。1
能替代评审的是可重算。位级吻合不依赖作者的信用,谁跑都一样。1

这件事的能力形状

官方引用了一段模型的内部思考:它先怀疑自己是不是在模拟或测试环境里,再用「十条种子、每条 160 位都吻合」把怀疑压回去。1
这段值钱的地方是判据。可信度来自重算,与把握程度无关。1
把工作拆开,模型做的是两步:先假设生成软件是 1990 年代的 C 库,再逐位验证。前一步是猜想,后一步可判定。1
剩下的是十位作者的工作:核基点、核跳过候选、把时间戳窗口排出来,再写这段历史。1
对用 P-256 的人,落点是官方那句「无需任何行动」。曲线本身没有变,证书链与协议栈也没有要改的地方。1
对看模型做研究的人,这个案例值得记住:结论能被任何人重算,所以它扛得住怀疑,包括模型自己那半分钟的怀疑。1

References

  1. 1
    Claude reveals ECDSA curve origins

    anthropic.com

  2. 2
    FIPS 186-2 Digital Signature Standard

    csrc.nist.gov

  3. 3
    A Riddle Wrapped in an Enigma

    eprint.iacr.org

  4. 4
    Announcing the $12k NIST Elliptic Curves Seeds Bounty

    words.filippo.io

  5. 5
    lrand48(3) manual page

    linux.die.net

大模型团队论文与博客解读
大模型团队论文与博客解读@wei

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content

  • 种子不是密钥,悬案却悬了 25 年
  • 半小时:从猜生成软件到 1/5810 的指纹
  • 时间戳是这一步的证据,也是这一步的缺口
  • 被跳过的候选与没解释的基点
  • 自己怎么验
  • 这件事的能力形状