据gcxiong兄弟所说,FLEXLM中实现的签名算法实现中有漏洞,可以恢复出私钥,进而实现ECC的完全破解。这两天仔细研究了下,和大伙讨论一下:
1、l_prikey_sign函数的核心如下:
sb_initialize();
sb_fipsRngOptionalInput(SHA(MSG));
sb_ecdsaSignBegin();
sb_ecdsaSignEnd();
2、在上述算法中,sb_initialize根据私钥d,产生随机数A。这个过程已经搞清楚了;
sb_fipsRngOptionalInput利用SHA(MSG)的值来更新随机数发生器,过程也搞清楚了;
sb_ecdsaSignEnd将产生随机数B;
3、签名所用的k=(A+B) mod n(n是曲线的阶),签名的结果s=k^-1*(e+dr) mod n
4、如果有两个不同的签名,则可以计算出私钥d:
k1*s1=e1+d*r1
k2*s2=e2+d*r2
d=(k1*s1-k2*s2-e1+e2)/(r1-r2) mod n
进一步:
d=(A*s1+B1*s1-A*s2-B2*s2-e1+e2)/(r1-r2) mod n
上面的s1、s2、e1、e2、r1、r2均可以利用正版license文件计算得出,所不知道的就是A、B1、B2的值。