ECDSA曲线种子之谜解开:不是哈希口令,而是Unix时间戳喂给lrand48
核心概要
NIST标准椭圆曲线参数的“种子”来源长期不明,这些种子由NSA提供且未作解释,社区多年怀疑其中可能藏有后门。Anthropic内部研究模型Claude在不到半小时内查明,P-192、P-224、P-256、P-384、P-521等曲线的种子并非任何哈希算法的输出,而是1990年代C库随机数生成器lrand48以Unix时间戳初始化后的输出,P-256的种子对应第1842次迭代。该结果不构成对ECDSA的攻击或弱点,反而使曲线被刻意植入后门的可能性明显下降;B-163种子以及P-224、P-256、P-384、P-521的基点生成方式仍未解释。
深度剖析
NIST标准椭圆曲线所用“种子”参数的来源被查明,这些参数此前只有数值、没有生成方式的说明。 这些种子由NSA提供给NIST,未附任何解释或理由,其出处是密码学界长期悬而未决的问题,Koblitz与Menezes曾撰文梳理相关争议,社区还为此设过悬赏。 此前流传的说法是种子来自某句幽默口令的哈希,但按该线索搜索均无结果;Claude在不到半小时内给出了P-192、P-224、P-256、P-384和P-521五个种子的生成方式。
种子不是哈希输出,而是1990年代C库伪随机数生成器lrand48的输出,该生成器由一个Unix时间戳初始化。 lrand48只返回48位内部状态的高31位,因此其输出带有可识别的痕迹,而哈希输出不会留下这种痕迹。 把种子写成五个32位字后,十个种子中有四个的全部20个字最高位均为0,随机出现这一模式的概率为1/5810;取第一个字遍历2¹⁷个隐藏位取值并检验后续四个字,四个种子全部通过。
素数曲线种子来自同一个lrand48,但每次输出保留的位数更少,需要从截断输出中恢复生成器内部状态。 从截断的线性同余生成器输出恢复状态是一个标准格问题,可用Lenstra–Lenstra–Lovász基约简算法求解,而此前并不知道种子暴露的是状态的哪些位。 对每个可能的位窗口运行求解器后,五个NIST素数曲线种子与五个ANSI X9.62种子呈现同一模式lrand48() >> 23,每个恢复出的48位状态都能重新生成该种子的全部160位。
部分曲线的基点来源也被定位到FreeLIP长整数运算包中的随机数生成器。 种子本身并不决定基点G,而基点的生成方式此前同样没有公开解释。 1997年5月生成的六条曲线(P-192以及ANSI X9.62示例曲线prime192v2、prime192v3和prime239v1至v3)的基点与该生成器一致,对应种子分别为20000、20420、20507、20509、20512和20517。
启示与展望
这项工作面向关心标准曲线参数来源的密码学与安全工程读者,结论覆盖P-192、P-224、P-256、P-384、P-521五个素数曲线种子,以及B-233、B-283、B-409、B-571四个二进制曲线种子,并解释了1997年5月生成的六条曲线的基点。作者明确表示读者应把它当作一个有趣的收尾章节和多年猜测的终结,不需要采取任何行动或改变做法。
B-163种子与Claude尝试过的所有解释都不吻合,仍未被解释;P-224、P-256、P-384、P-521以及NIST二进制曲线的基点生成方式也尚不清楚。此外,P-256的发布种子是第1842个候选,但同一次运行中的第876个候选同样给出符合尺寸的素数阶曲线,P-224的运行跳过了三个此类曲线,ANSI X9.62示例曲线背后的两次运行又跳过了七个,选择标准未知,也不确定这是否只是无意造成的。作者认为被跳过的候选数量很少,因此曲线被削弱后选中的可能性不大,但无法从数字中看出总共运行了多少次。
