ECDSA Nonce 重複檢測計算器

SECP256k1 加密工具 • 密碼學

ECDSA Nonce 重複導致的 Bitcoin 私鑰計算

如果兩個 Bitcoin 簽章使用相同的 r 值,代表可能重複使用相同的 Nonce。輸入相關參數的十六進位值,即可進行數學計算。

計算結果
-


輸入範例:

R = d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1
S1 = 44e1ff2dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e
S2 = 9a5f1c75e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab
Z1 = c0e2d0a89a348de88fda08211c70d1d7e52ccef2eb9459911bf977d587784c6e
Z2 = 17b0f41c8c337ac1e18c98759e83a8cccbc368dd9d89e5f03cb633c265fd0ddc



Bitcoin 重大密碼學安全風險

Bitcoin ECDSA 簽章漏洞:R 值與 Nonce 重複使用的安全風險

Bitcoin 的 ECDSA 簽章依賴安全的 Nonce 生成機制。如果相同的 Nonce 被重複使用,可能導致簽章安全性遭到破壞,因此 Nonce 的唯一性是 Bitcoin 密碼學安全的重要基礎。

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 使用以下數學關係:

ECDSA 簽章計算公式
s ≡ k⁻¹ × (z + r × d) mod n

為什麼 Nonce 重複使用會造成風險?

ECDSA 中的 Nonce k 必須以安全方式產生,而且不同簽章不應意外使用相同的 Nonce。

如果錢包軟體存在實作錯誤,或者使用品質不佳的偽亂數產生器(PRNG),就可能在不同交易的簽章過程中重複使用相同的 k。

由於 R = k × G ,當兩次簽章使用相同的 k 時,其對應的 r 值也可能相同。因此,在公開 Bitcoin 區塊鏈上的交易資料中,可能觀察到具有相同 R 值(r) 的多筆簽章。

數學原理:Nonce 重複與私鑰風險

假設兩筆交易的 ECDSA 簽章使用相同的 r 值,且符合相同 Nonce 的特定條件。

交易 1:s₁ ≡ k⁻¹ × (z₁ + r × d) mod n
交易 2:s₂ ≡ k⁻¹ × (z₂ + r × d) mod n

將兩個公式相減後,與私鑰相關的 r × d 項目會被消去。

s₁ - s₂ ≡ k⁻¹ × (z₁ - z₂) mod n

在符合 Nonce 重複條件的情況下,可以透過模運算求得相關的 k 值。

步驟 1:計算 Nonce(k)
k ≡ (z₁ - z₂) / (s₁ - s₂) mod n

在取得符合條件的 k 後,再代入 ECDSA 關係式即可進一步計算相關的 私鑰(d) 。

步驟 2:計算私鑰(d)
d ≡ (s₁ × k - z₁) / r mod n

實際案例與 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 生成機制。

  1. 確定性 Nonce 生成(RFC 6979)
    RFC 6979 提供確定性 ECDSA Nonce 生成方法,可以根據 d 與訊息雜湊 z 產生 Nonce,降低單純依賴外部亂數產生器所帶來的部分實作風險。
    k = HMAC-SHA256(d, z)
    這種方法可以讓相同輸入在符合 RFC 6979 的情況下產生可重現的 Nonce,同時降低因亂數產生器品質不佳而意外重複 Nonce 的風險。
  2. Schnorr 簽章(BIP 340 / Taproot)
    Bitcoin Taproot 引入了 Schnorr 簽章機制。BIP 340 對 Schnorr 簽章及 Nonce 生成方式制定了明確規範,使 Bitcoin 能夠採用不同於傳統 ECDSA 的簽章方案。

重點整理

Bitcoin 簽章的安全性不只取決於 ECDSA 或橢圓曲線本身,也取決於 Nonce 是否以安全且正確的方式產生。Nonce 重複使用可能造成嚴重的密碼學風險,因此 Bitcoin 軟體與錢包開發者應採用經過驗證的密碼學函式庫與標準,例如 RFC 6979 以及 Schnorr 簽章與 BIP 340 ,並正確處理私鑰與簽章資料。