問題與解答

如何從兩個共享相同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。

繼續探索數據目錄搜尋