代入u1、u2
我们得到这个等式。 然后再看看这个等式: s = k^-1 (z + r*da) mod n 两边乘以(s^-1 k) 得到 等式 k = s^-1 (z + rda) mod n 两边再乘以G,得到 kG = s^-1*(z + r *da)*G mod n = P 换句话说,如果(r,s)是有客户端私钥签名Z得到,则我们通过u1,u2计算的到的P值得x分量和r相同。 K的重要性 当我们使用ECDSA进行签名的时候,k的保密性非常重要。如果我们对所以的签名操作都用一样的k或者我们的随机数生成器存在可预测性,一个攻击者可能会猜出私钥。 索尼几年前曾犯过这个错误。PlayStation 3 只能运行被索尼的进行ECDSA签名的游戏。如果我想为PlayStation 3开发了一个新的游戏,除非我从索尼获得签名值,否则我及时发布了,也运行不了这个游戏。问题是,索尼签名时用了一个静态的k值而不是随机生成的。 这么获取私钥d和随机数k? 看看这个等式 s = k^-1 (z + r*da) mod n 显然,未知数只有2个,da和k。我们买2份索尼游戏,签名值分别是(r1 , s1)、(r2, s2), 由于k值一样,故r 值也一样 s1 = k^-1 (z1 + r*da) mod n等式1 s2= k^-1 (z2 + r*da) mod n等式2 等式1-等式2 s1 -s2 = k^-1 (z1 - z2) mod n z1和z2 可以自己使用哈希算法对软件进行哈希能够获取到。s1和s2能够从前面值中获取到。所以k值就轻松的获取到了 K = (s1 -s2)^-1 * (z1 -z2) mod n 再把k值代入等式1或者等式2,就能计算da了。
|