Transactions

當兩個隨機數為 k 和 k*2 時如何導出私鑰

  • January 15, 2022

在兩個不同的簽名中分別使用 k 和 k*2 的同一個私鑰是否容易受到攻擊?如果是這種情況下如何計算密鑰

c0e2d0a89a348de88fda08211c70d1d7e52ccef2eb9459911bf977d587784c6e 是 k1 隨機數。a3c2dce777813dc3f0d7a105a5fd56d5894ba30ffa01ba79667cadba37a9d8df 是私鑰。

假設您正在談論 ECDSA 簽名。對於 BIP340/Schnorr 簽名,請參閱此答案

對於有效簽名

讓:

  • d: 私鑰
  • P=d*G: 公鑰
  • k1: (第一個)nonce
  • R1=k1*G: 公眾第一隨機數
  • r1=R1.x mod n:公共的第一個隨機數,因為它將被編碼在簽名中。
  • k2=2*k1, R2=k2*G=2*R1, r2=R2.x mod n: 與第二個 nonce 相同
  • z1z2:各自的消息雜湊

然後,這兩個簽名將成為對(r,s)(r',s')並且:

  • s1 = (z1 + r1*d) / k1 mod n
  • s2 = (z2 + r2*d) / k2 mod n = (m2 + r2*d) / (2*k1) mod n

等式兩邊乘以右邊的分母:

  • s1*k1 = z1 + r1*d mod n
  • 2*s2*k1 = z2 + r2*d mod n

假設,這是一組具有兩個未知數 (和)2*r1*s2 ≠ r2*s1的兩個線性方程組,解:k1``d

  • d = (z2*s1 - 2*z1*s2) / (2*r1*s2 - r2*s1) mod n
  • k1 = (z2*r1 - z1*r2) / (2*r1*s2 - r2*s1) mod n

永遠不要將相關的隨機數用於 ECDSA(或 Schnorr)簽名。每次都創建一個新鮮的、獨立的、隨機數。行業標準是使用RFC6979生成隨機數。

對於假“簽名”

儘管滿足等式,但您提供的值與真實簽名並不對應。這是因為要使簽名有效,您必須提供散列到z值的消息,而不僅僅是結果。你不能在這裡這樣做,因為z2 = (r2/r1)*z1. z對於作為散列結果的值,這種匹配比率不會(也不會)發生。

事實證明,給定任何 ECDSA 三元組(r,s,z)和整數a,可以找到另一個三元組。設R是一個橢圓曲線點,其 X 座標等於r(mod n),並且R' = aR,以及r'的 X 座標R'。然後是另一個 ECDSA 三元組,(r',r'*s/(a*r'),r'*z/r)對應於乘以ka但是,這又不是一個有效的簽名,因為它的 z 值不會是可計算消息的雜湊值。在這種情況下,上面的公式也將無法檢索到私鑰,因為第二個“簽名”不是使用私鑰創建的。

引用自:https://bitcoin.stackexchange.com/questions/110956