知识问答

如何从两个共享相同k值的签名中推导出私钥?

阅读字号

ECDSA 签名是 (r,s) 对,其中 r=(k*G).x mod n,且 s = (m + r*x)/k mod n,其中 x 是私钥,k 是随机 nonce,m 是消息。 如果你有两个 s 值 s1 和 s2,它们对应同一个私钥且使用同一个 nonce k(因此具有相同的 r 值),则以下关系成立:

s1 = (m1 + r*x)/k s2 = (m2 + r*x)/k

由此我们可以推导出:

s1 * k = m1 + r*x s2 * k = m2 + r*x (s1 - s2) * k = m1 - m2 k = (m1 - m2) / (s1 - s2) x = (s1 * (m1 - m2) / (s1 - s2) - m1) / r x = (m1*s2 - m2*s1) / (r*(s1 - s2)) (全部模 n)

所以,你不仅让检测使用相同 nonce 的签名变得轻而易举(它们具有可识别的 r 值),而且一旦有人看到两个签名,就有一个简单的公式可以计算出私钥。 这种攻击至少自 2013 年以来就已被知晓并在比特币网络上被积极利用:https://bitcointalk.org/index.php?topic=271486.0 。不要重用 k 值。使用 RFC6979 以确定性但安全的方式生成它们。 另请注意,仅仅 nonce 不同是不够的。它们也不能以已知方式相关联。例如,你不能对一个签名使用 k,而对下一个签名使用 k+1。

继续了解数据目录搜索