Anthropic在10月16日发布了一篇研究说明,讲的是Claude在不到半小时里,把NIST五条标准椭圆曲线的种子来源全部追了出来。这五条曲线是P-192、P-224、P-256、P-384和P-521。答案朴素到有点扫兴:它们不是任何哈希算法的产物,而是上世纪90年代C语言库里lrand48这个伪随机数生成器的输出,初始化的输入是一个Unix时间戳。
要理解这事为什么被惦记了二十多年,得回到标准本身。ECDSA是目前用得最广的椭圆曲线密码标准,2000年被NIST收进FIPS186-2数字签名标准。标准里给每条曲线公布了一个椭圆曲线种子,这个种子的哈希值用来定义曲线方程里的系数b。问题在于,这些种子由美国国家安全局提供,既没说明来历也没给理由。查不到出处,就难免有人怀疑参数是不是被刻意挑过。
流传最广的一个说法指向NSA的数学家Jerry Solinas。传闻说种子是他拿一句玩笑话做哈希算出来的,内容大意是给某两位同事加薪。Anthropic有几位员工沿着这条线索追过,一无所获,后来证实这条路本来就是错的。密码学家Neal Koblitz与Alfred Menezes曾把这场争议写成一篇题为“谜中谜”的文章。2023年Solinas去世,同时代能回忆细节的同事也联系不上,线索就断在这里。
Claude换了个问法。它没有去猜那句话,而是先想上世纪90年代末的人会用什么工具生成参数,判断对方大概率用了当时C库自带的弱伪随机数生成器。这类老生成器的输出弱到可以被识别。它写了一个扫描器,沿着每个公布的种子逐位滑动,测了34组老生成器与输出片段的组合,注意到某些种子里每个32位字的最高位都是0,这种规律纯靠巧合出现的概率,大约是五千八百一十分之一。
对上的是lrand48,一个只返回内部状态一部分的经典C库生成器。接下来它用格基约简里常见的LLL方法把隐藏状态还原出来,再让生成器往回倒推,终点是一个Unix时间戳。五条素域曲线的起始时间戳都落在1997年5月到1998年4月之间。用得最多的P-256,标准里那个种子是某次运行里的第1842个候选值。
Anthropic在结论部分把话说得很克制:这不是破解,也没有发现新的攻击方式,更不构成ECDSA的弱点。相反,它让曲线被刻意留后门的可能性变得更小。理由不难懂——要藏一个后门,设计者得在数量庞大的种子里反复挑选,直到挑出带有可利用缺陷的那一个;而从一个具体秒数启动的普通生成器里取值,可操作的余地几乎为零。
没解完的部分也一并列了出来。二进制曲线B-163的种子至今对不上任何尝试,P-224与P-256等几条曲线的基点是怎么生成的仍然不清楚,另外P-256那次运行里的第876个候选其实也能用,却被跳过了,原因不明。复现代码已经公开,任何人都可以自己跑一遍。这套答案顺带填上了一笔悬赏——密码学家Filippo Valsorda设的奖金被Anthropic团队领走,钱转手捐给了互联网安全研究小组。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
