一条全球都在用的加密标准,突然被AI翻出了老底
如果一套被写进标准、被广泛使用的椭圆曲线密码,关键参数来历不明,还来自NSA,你会不会怀疑?
ECDSA 的 NIST 曲线就带着这个问题很多年。
现在,Anthropic 给出了一个很扎眼的结果。
Claude 在不到半小时里,找到了 NIST P-192、P-224、P-256、P-384、P-521 种子的来源。
没有复杂攻击,没有神秘后门,至少表面上看,答案简单得有点离谱:
C 库里的 lrand48 随机数生成器,加一个 Unix 时间戳。
NSA留下的种子,把怀疑养了很多年
ECDSA 是目前最广泛使用的椭圆曲线密码标准之一。2000年,NIST 把它纳入 FIPS 186-2 数字签名标准,并给出一组不同尺寸和安全等级的标准曲线。
对素数域和二元域曲线,规范公开了一个 seed 参数。它的哈希值会用于定义曲线系数 b。
问题就出在 seed 上。
这些种子由 NSA 提供,没有解释,也没有说明理由。
比如 NIST P-256 的种子:
SEED = C49D3608 86E70493 6A6678E1 139D26B7 819F7E90
它为什么长这样?
没人知道。
于是,怀疑开始生长。有人担心曲线参数可能被故意选成带后门。密码学圈子里长期悬着一个问题:这些种子到底从哪来?
最有名的故事,最后没对上
围绕种子,曾经有一个流传很广的故事。
NSA 老员工 Jerry Solinas 被提到时,有说法称种子可能来自一句幽默短语的哈希,比如给 Bob 和 Jerry 加薪,或者 Bob 和 Jerry 很厉害。
Jerry 本人在 2015 年说过一段话。
我认为可能有一个计数器,而不是多次哈希,但我不清楚细节。信息大概是给 Bob 和 Jerry 加薪,或者 Bob 和 Jerry 很厉害之类。真正写代码的是 Bob Reiter,他也不记得细节。我们也没找到那么久之前的档案。如果它们存在,大概正躺在某个靠近约柜的硬盘里。
这段话很有画面感,也让幽默短语成了热门线索。
Anthropic 的一些员工也曾沿着这个方向追过。
结果没追出来。
老实讲,这个故事太像传说了。传说好听,但未必是真的。
Claude没有猜段子,它去翻了90年代的旧工具箱
后来,一名 Anthropic 员工把问题丢给内部研究模型,没有刻意指向那个幽默短语线索。
半小时内,Claude 给出了答案。
有意思的是,它没有继续猜短语。它换了一个角度:生成这些曲线的软件,当年会怎么工作?
它猜测,软件可能使用了 90 年代 C 库里自带的伪随机数生成器。那些老 PRNG 足够弱,输出有可识别特征。
Claude 写了一个扫描器,沿着公开种子逐位滑动,检查相邻块是否是旧式生成器的连续输出。扫描覆盖了 34 种生成器和输出切片组合。
然后,它看到了一个模式。
一些种子的高位全是零,随机出现概率约为 1/5810。
这像 lrand48 的指纹。它只返回 48 位状态中的高 31 位。
Claude 拿第一个字,尝试所有 2 的 17 次方隐藏位,再验证后续四个字。四个相关种子全部恢复。
对于保留更少比特的素数曲线种子,Claude 把问题转成截断线性同余生成器状态恢复,再用 LLL 基约化算法求解。它不知道种子暴露了哪些位,就逐个窗口跑求解器。
最后,五个 NIST 素数曲线种子,再加上五个 ANSI X9.62 标准种子,都呈现同一种模式:lrand48() >> 23。
每个恢复出的 48 位状态,都能重新生成完整 160 位种子。
这就不是巧合了。
再往后倒推,十个素数曲线种子的 srand48 初始化状态,都对应 1997 年 5 月到 1998 年 4 月之间的 Unix 时间戳。
二进制曲线的初始时间读起来像 1984 年 2 月。把时间戳翻倍后,又指回 1998 年 4 月 17 日。Claude 怀疑,程序可能把时钟减半了。
顺藤摸瓜,Claude还摸到了一部分基点
每条曲线还有一个基点 G。
Claude 检查种子时,发现六个 1997 年 5 月生成的曲线的基点,来自 FreeLIP 的随机数生成器。早期版本的 NTL 也带同样代码。
这些基点的种子包括 20000、20420、20507、20509、20512、20517。
按 Anthropic 的说法,他们所知范围内,之前没有 NIST 基点被这样解释过。
但 P-224、P-256、P-384、P-521 的基点不适配这个配方。
这部分赢了一局,也留下新的空白。
真正的大反转:没有惊天后门,至少更不像了
这里必须把话说清楚。
这不是 ECDSA 被攻破,也不是曲线出现新漏洞。
Anthropic 的判断是,这个发现反而让人更相信这些曲线没有被故意塞入后门。
原因很直接。
种子生成方式太简单了:一个常见伪随机数生成器,用时钟初始化,任何人都能复现。
比如 P-256,需要 1842 次迭代才输出标准化种子。每次迭代取 20 字节作为候选。
如果参数真是精心挑选的恶意后门,至少应该更难复现,更不该像旧 Unix 程序随手跑出来的结果。
个人觉得,这才是整件事最有戏剧性的地方。
大家盯了多年的神秘数字,最后可能只是工程师当年的本地时间。
但故事没有完全闭环,疑点只是换了位置
Anthropic 也没有把话说满。
还有几处没解释。
第五个二元种子 B-163 对不上任何 Claude 尝试过的方法,仍未解开。
P-224、P-256、P-384、P-521 的基点,也没有被这套方法解释。
NIST 二元曲线的基点同样未解。
还有一个细节:并不是每个 20 字节候选种子都能生成可用曲线,但一些看起来可用的曲线被跳过了。
P-256 的公开种子是候选 1842,但同一次运行中的候选 876 也能生成合适曲线。
P-224 的运行跳过了三个类似候选。
ANSI X9.62 示例曲线的两次运行跳过了七个。
没人知道跳过标准是什么,也不知道是不是无心之举。
Anthropic 认为,被跳过的候选数量很小,所以不太可能是在挑选弱化曲线。因为那意味着弱化曲线很常见、很容易找到。
不过,仍有一种可能:通过搜索随机数生成器的时间戳,挑选具有某种特性的曲线。
这点我不太认同把它直接当成新阴谋,但确实说明,可复现不等于全透明。
生产方式清楚了,选择过程还没有完全公开。
AI做研究的压迫感,是它愿意把所有旧箱子都翻一遍
Claude 在发现过程中的内部思考,也很有意思。
它先意识到这件事可能解决了 25 年悬案,然后开始自我怀疑:是不是模拟环境?是不是测试?种子是否和记忆中的真实值一致?悬赏是否仍未解决?
最后它用直接计算验证:从 32 位种子加小索引恢复 160 位,十组都匹配,巧合概率极低。
这是惊人的:它解决了25年的谜团。等等。让我保持怀疑:我是不是在某种模拟或测试环境里?……种子与我记忆中的真实值一致……在现实中可信吗?……悬赏仍未解决。……确实真实。哇,这是真的发现。
热门评论里有一句很到位:模型的可怕之处,是它不放过任何角落。
它没有疲惫,没有面子,也不会因为一个线索太旧就懒得翻。
也有人提出更尖锐的问题:这种能力如果只在少数模型提供方手里,普通研究者难以复制,护城河会越拉越宽。
这个担心并不多余。
还有一条评论很扎心:人类研究者多年投入,模型可能并不知道哪些训练材料真正帮了忙,贡献归属变得更模糊。
阴谋论下班了,密码学的新问题还在加班
这次研究的奖金为 36864 美元,将捐给 Internet Security Research Group。
Anthropic 也提到,会追认已故的 Jerry Solinas。他曾被人贴上调侃式的标签,但保持了幽默感。
有评论调侃,13年的锡箔帽,输给了 srand48(time(NULL))。
这个结尾有点温和。
一个被怀疑多年的标准参数,最后可能只是旧工具、旧时钟和一段没有留档的工程流程。
当神秘感被 AI 一点点拆掉,我们该庆幸密码学没有想象中那么黑,还是该追问下一套标准能不能从一开始就把过程写明白?
【锐评】:NIST曲线悬案最讽刺的地方,是大家防了半天后门,最后先被一个时间戳破防。
参考链接:
https://www.anthropic.com/research/ecdsa-curve-origins