Transactions
當兩個隨機數為 k 和 k*2 時如何導出私鑰
在兩個不同的簽名中分別使用 k 和 k*2 的同一個私鑰是否容易受到攻擊?如果是這種情況下如何計算密鑰
c0e2d0a89a348de88fda08211c70d1d7e52ccef2eb9459911bf977d587784c6e 是 k1 隨機數。a3c2dce777813dc3f0d7a105a5fd56d5894ba30ffa01ba79667cadba37a9d8df 是私鑰。
假設您正在談論 ECDSA 簽名。對於 BIP340/Schnorr 簽名,請參閱此答案。
對於有效簽名
讓:
d
: 私鑰P=d*G
: 公鑰k1
: (第一個)nonceR1=k1*G
: 公眾第一隨機數r1=R1.x mod n
:公共的第一個隨機數,因為它將被編碼在簽名中。k2=2*k1
,R2=k2*G=2*R1
,r2=R2.x mod n
: 與第二個 nonce 相同z1
和z2
:各自的消息雜湊然後,這兩個簽名將成為對
(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)
對應於乘以k
。a
但是,這又不是一個有效的簽名,因為它的 z 值不會是可計算消息的雜湊值。在這種情況下,上面的公式也將無法檢索到私鑰,因為第二個“簽名”不是使用私鑰創建的。