ECDSA Nonce 重複導致的 Bitcoin 私鑰計算
如果兩個 Bitcoin 簽章使用相同的 r 值,代表可能重複使用相同的 Nonce。輸入相關參數的十六進位值,即可進行數學計算。
輸入範例:
R = d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1
S1 = 44e1ff2dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e
S2 = 9a5f1c75e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab
Z1 = c0e2d0a89a348de88fda08211c70d1d7e52ccef2eb9459911bf977d587784c6e
Z2 = 17b0f41c8c337ac1e18c98759e83a8cccbc368dd9d89e5f03cb633c265fd0ddc
Bitcoin ECDSA 簽章漏洞:R 值與 Nonce 重複使用的安全風險
Bitcoin 的安全機制建立在 橢圓曲線數位簽章演算法(ECDSA) 等密碼學技術之上。Bitcoin 使用 secp256k1 橢圓曲線來進行數位簽章。當使用者建立 Bitcoin 交易並將交易廣播到網路時,錢包會使用 私鑰(Private Key) 對交易進行簽章,以證明使用相關資金的權限。
在正常且正確實作的情況下,ECDSA 本身具有非常高的安全性。然而,簽章實作中的亂數生成或 Nonce 管理若出現問題,可能產生嚴重的安全風險。其中一個重要案例就是 ECDSA Nonce 重複使用漏洞。
ECDSA Bitcoin 簽章的基本原理
Bitcoin 的 ECDSA 簽章主要由兩個大整數 (r, s) 組成。這些參數與交易雜湊、私鑰以及一次性 Nonce 有密切關係。
- z:待簽章資料經 SHA-256 計算後得到的雜湊值。
- d:Bitcoin 私鑰,用於產生數位簽章。
- k(Nonce):每次簽章使用的一次性數值。對不同簽章而言,Nonce 必須以安全方式產生,避免發生重複或可預測的情況。
- r:橢圓曲線點 R = k × G 的 x 座標,其中 G 是 secp256k1 的基準點。
- s:透過 ECDSA 模組化運算產生的簽章參數。
在產生簽章的 s 參數時,ECDSA 使用以下數學關係:
為什麼 Nonce 重複使用會造成風險?
ECDSA 中的 Nonce k 必須以安全方式產生,而且不同簽章不應意外使用相同的 Nonce。
如果錢包軟體存在實作錯誤,或者使用品質不佳的偽亂數產生器(PRNG),就可能在不同交易的簽章過程中重複使用相同的 k。
由於 R = k × G ,當兩次簽章使用相同的 k 時,其對應的 r 值也可能相同。因此,在公開 Bitcoin 區塊鏈上的交易資料中,可能觀察到具有相同 R 值(r) 的多筆簽章。
數學原理:Nonce 重複與私鑰風險
假設兩筆交易的 ECDSA 簽章使用相同的 r 值,且符合相同 Nonce 的特定條件。
交易 2:s₂ ≡ k⁻¹ × (z₂ + r × d) mod n
將兩個公式相減後,與私鑰相關的 r × d 項目會被消去。
在符合 Nonce 重複條件的情況下,可以透過模運算求得相關的 k 值。
在取得符合條件的 k 後,再代入 ECDSA 關係式即可進一步計算相關的 私鑰(d) 。
實際案例與 Bitcoin 區塊鏈監控
Nonce 重複並不是單純存在於數學模型中的問題。歷史上曾經出現過與 Bitcoin 錢包亂數生成及 ECDSA 簽章實作相關的安全事件。
由於 Bitcoin 區塊鏈上的交易資料具有公開可驗證的特性,因此研究人員可以分析公開簽章資料,尋找可能存在的重複 r 值。這也是 ECDSA 簽章安全研究中的重要分析方法。
Android SecureRandom 問題
早期 Android Java SecureRandom 實作曾發生與亂數生成相關的安全問題。部分 Bitcoin 錢包受到影響後,可能產生重複 Nonce,進而造成相關簽章的安全風險。
Blockchain.info 相關問題
早期 Web 錢包服務的簽章實作也曾出現與亂數及 Nonce 使用相關的安全問題。這些歷史事件說明,ECDSA 的安全性除了依賴數學演算法本身,也高度依賴實際軟體實作。
當公開交易中出現可能重複的 r 值時,可以進一步進行密碼學分析,以判斷這些簽章是否真的使用了相同的 Nonce。需要注意的是,僅僅看到相同的 r 值並不代表所有情況都可以直接推導出私鑰,實際結果仍取決於簽章格式、Nonce 關係及相關數學條件。
Bitcoin 生態系統中的安全防護
為降低 ECDSA Nonce 生成錯誤造成的風險,現代 Bitcoin 軟體通常會採用更可靠的簽章與 Nonce 生成機制。
-
確定性 Nonce 生成(RFC 6979)
RFC 6979 提供確定性 ECDSA Nonce 生成方法,可以根據 d 與訊息雜湊 z 產生 Nonce,降低單純依賴外部亂數產生器所帶來的部分實作風險。k = HMAC-SHA256(d, z)這種方法可以讓相同輸入在符合 RFC 6979 的情況下產生可重現的 Nonce,同時降低因亂數產生器品質不佳而意外重複 Nonce 的風險。 -
Schnorr 簽章(BIP 340 / Taproot)
Bitcoin Taproot 引入了 Schnorr 簽章機制。BIP 340 對 Schnorr 簽章及 Nonce 生成方式制定了明確規範,使 Bitcoin 能夠採用不同於傳統 ECDSA 的簽章方案。
重點整理
Bitcoin 簽章的安全性不只取決於 ECDSA 或橢圓曲線本身,也取決於 Nonce 是否以安全且正確的方式產生。Nonce 重複使用可能造成嚴重的密碼學風險,因此 Bitcoin 軟體與錢包開發者應採用經過驗證的密碼學函式庫與標準,例如 RFC 6979 以及 Schnorr 簽章與 BIP 340 ,並正確處理私鑰與簽章資料。