Dual_EC_DRBG

background

NIST 800-90 random

RFC 8937 Randomness Improvements for Security Protocols

http://blog.0xbadc0de.be/archives/155

随机数生成算法 NSA后门

这个问题在于dQ=P,而 \(i_2 .. i_n, o_1 .. o_n\) 可以交错链式生成(没有其他伪随机参数加入计算)。

因此直接回溯至 \(i_1Q = A\) ,而A不超过32 bytes,可以直接进行暴力猜解。

指定x解椭圆方程求出可行的y,再计算比对 \(o_1\) 。。。

从这点看,结尾说的没错,确实疯狂。

detail

Dual EC: A Standardized Back Door

如果通过output可以推测PRNG的某些内部状态,进而可以推测后续的output,则PRNG是有问题的。

密码算法:设计,分析,标准化,选择,实现,部署

\[ \begin{align}\begin{aligned}state-based PRNG, with f and g s_1 = f(s_0) r_1 = g(s_1)\\ s_2 = f(s_2) r_2 = g(s_2)\end{aligned}\end{align} \]

显然,f and g 应该是one way function, 且如果是

Basic Dual EC

\[ \begin{align}\begin{aligned}s_1 = x(s_0 * P),r_1 = x(s_1 * Q) ,显然,如果知道P=d*Q,则整个 s_i, r_i 的交错序列就可以递推出来。\\假设 r = (r_1, y_r_1) = s_1*Q\\d*r = d*s_1*Q = s_1*d*Q = s_1*P s_2 = x(d*r) = x(s_1*P) //可见,s_2 内部状态可通过 r_1 ,结合d推导出来\end{aligned}\end{align} \]

Dual EC 2006 with additional input

\[ \begin{align}\begin{aligned}t_0 = s_0 xor H(adin0)\\s_1 = x(t_0 * P) r_1 = x(s_1 * Q) t_1 = s_1 xor H(adin1)\\s_2 = x(t_1 * P) // 可见,此时 s_2 与 r_1 之间没有递推关系 r_2 = x(s_2 * Q)\\s_3 = x(s_2 * P) // s_3 = x(d * r_2) = x(d * s_2 * Q) = x(s_2 * P),s_3与s_2/r_2之间。。。 r_3 = x(s_3 * Q)\end{aligned}\end{align} \]

Dual EC 2007 with additional input

\[ \begin{align}\begin{aligned}t_0 = s_0 xor H(adin_0)\\s_1 = x(t_0 * P) r_1 = x(s_1 * Q)\\s_2 = x(s_1 * P) t_2 = s_2 xor H(adin_2)\\s_3 = x(t_2 * P) r_3 = x(s_3 * Q)\\s_4 = x(s_3 * P) // 可见,s_2 与 s_1/r_1、s_4 与 s_3/r_3 ,s_5 与 s_4/r_4 之间。。。 r_4 = x(s_4 * Q)\\s_5 = x(s_4 * P)\end{aligned}\end{align} \]