比特幣密碼學基礎

深入理解比特幣核心密碼學技術:SHA-256、RIPEMD-160、secp256k1 橢圓曲線、ECDSA 與 Schnorr 簽章。

比特幣密碼學基礎

比特幣的安全性建立在現代密碼學之上,理解這些密碼學基礎對於深入理解比特幣的運作原理至關重要。本文將介紹比特幣核心使用的密碼學技術:哈希函數、橢圓曲線密碼學與數位簽章。

密碼學哈希函數

SHA-256

比特幣廣泛使用 SHA-256(Secure Hash Algorithm 256-bit)作為主要的哈希函數。SHA-256 屬於 SHA-2 家族,由美國國家安全局(NSA)設計,並於 2001 年發布為 FIPS 180-4 標準。

SHA-256 的核心特性包括:

在比特幣中,SHA-256 被用於:

RIPEMD-160

比特幣地址的生成同時使用 SHA-256 和 RIPEMD-160。RIPEMD-160 是一種 160 位元輸出長度的哈希函數,設計於 1996 年。比特幣地址的產生過程是先對公鑰進行 SHA-256 哈希,再對結果進行 RIPEMD-160 哈希,這種「雙重哈希」設計增加了安全性。

地址生成流程:
公鑰 → SHA-256 → RIPEMD-160 → Base58Check 編碼 → 比特幣地址

使用 RIPEMD-160 的主要原因是產生較短的地址(20 位元組 = 40 個十六進制字元),這比直接使用 SHA-256 的 32 位元組地址更方便人類閱讀和使用。

哈希函數的安全性證明

比特幣使用 SHA-256 的安全性基礎

SHA-256 的安全性建立在以下數學假設之上:

抗碰撞性(Collision Resistance)

碰撞是指兩個不同的輸入產生相同的輸出。對於 SHA-256,沒有已知高效的碰撞攻擊方法。比特幣使用這種特性來確保每筆交易都有唯一的 ID、區塊頭的 Merkle 根確保交易集合的完整性、區塊哈希作為工作量證明的證明。

數學上,如果找到了 SHA-256 的碰撞,意味著找到 x ≠ y 使得 SHA-256(x) = SHA-256(y),這將花費約 2^128 次哈希運算(基於生日攻擊)。即使使用世界上所有的計算資源,這也需要數十億年的時間。

原像抗性(Preimage Resistance)

給定一個哈希輸出 h,無法在合理時間內找到任何輸入 m 使得 SHA-256(m) = h。這保證了比特幣地址無法從哈希值反推,以及工作量證明無法逆向計算。

第二原像抗性(Second Preimage Resistance)

給定輸入 m1,無法找到不同的 m2 使得 SHA-256(m1) = SHA-256(m2)。這確保了攻擊者無法替換已確認的交易。

SHA-256 內部結構與攻擊極限

SHA-256 屬於 Merkle-Damgård 結構的哈希函數,核心是使用 Davies-Meyer 結構的壓縮函數。壓縮函數由模組 2^32 加法、邏輯函數和旋轉組成。

截至目前為止,對 SHA-256 的最佳攻擊包括減少到 31 輪的部分攻擊,以及差分攻擊最多覆蓋約 37 輪,這些攻擊距離完整破解仍然遙遠。

量子計算威脅

量子計算機使用 Grover 算法可以提供平方根加速:暴力破解從 2^256 降至 2^128,碰撞攻擊從 2^128 降至 2^64。這仍然遠超實用範圍,但促使比特幣社區開始研究後量子替代方案。

橢圓曲線密碼學

secp256k1 曲線

比特幣使用橢圓曲線密碼學(Elliptic Curve Cryptography, ECC)進行密鑰生成和數位簽章。具體而言,比採用的是 secp特幣256k1 曲線,其方程式為:

y² = x³ + 7 (在有限域 Fp 上)

其中 p = 2^256 - 2^32 - 977

secp256k1 是特意選擇的曲線,與美國國家標準與技術研究所(NIST)推薦的 secp256r1 不同。secp256k1 的選擇基於以下考量:

  1. 效率:該曲線的參數使得橢圓曲線運算更加高效
  2. 透明度:曲線參數的選擇方式避免了任何可疑的預設值
  3. 比特幣原創性:中本聰選擇了 NIST 以外的曲線,展示了比特幣社區的獨立性

secp256k1 的數學特性詳解

secp256k1 曲線定義在素數域 Fp 上,其中 p = 2^256 - 2^32 - 977。這個特定的素數選擇經過精心設計,使得模組運算特別適合電腦處理。

為何選擇此素數

p 的選擇基於以下考量:使用 2^256 - 2^32 - 977 的形式可以簡化運算,因為大多數運算結果仍然在 2^256 以內;這個素數與 2^32 對齊,有助於優化在 32 位元處理器上的效能。

曲線的階(Order)

曲線上所有點的數量(稱為階)約為 n ≈ 2^256:

n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

n 接近但不完全等於 2^256,這是一個重要的安全特性。如果 n = 2^256,某些攻擊會變得更容易。

橢圓曲線運算基礎

在橢圓曲線上,點的加法運算是定義曲線上兩點相加得到第三點的幾何運算:

[點加法幾何意義]
      Q
      *
     / \
    /   \
   /     \
  *-------*
  P       R= P+Q

橢圓曲線離散對數問題的數學推導

橢圓曲線密碼學的安全性根本建基於「橢圓曲線離散對數問題」(Elliptic Curve Discrete Logarithm Problem, ECDLP)的計算困難性。以下從數學角度詳細推導這一問題的核心原理。

有限域上的橢圓曲線

secp256k1 曲線定義於素數域 Fp 上,其中 p = 2^256 - 2^32 - 977。曲線方程式為:

$$y^2 \equiv x^3 + 7 \pmod{p}$$

所有滿足此方程式的點 (x, y) 加上無窮遠點 O 構成橢圓曲線群 E(Fp)。

點加法的代數公式

設 P = (x₁, y₁) 和 Q = (x₂, y₂) 為曲線上兩點,定義 R = P + Q = (x₃, y₃):

當 P ≠ Q 時(點加法)

$$\lambda = \frac{y2 - y1}{x2 - x1} \pmod{p}$$

$$x3 = \lambda^2 - x1 - x_2 \pmod{p}$$

$$y3 = \lambda(x1 - x3) - y1 \pmod{p}$$

當 P = Q 時(點倍增)

$$\lambda = \frac{3x1^2 + a}{2y1} \pmod{p}$$

$$x3 = \lambda^2 - 2x1 \pmod{p}$$

$$y3 = \lambda(x1 - x3) - y1 \pmod{p}$$

其中 secp256k1 的參數 a = 0, b = 7。

離散對數問題的定義

给定橢圓曲線上的生成點 G 和目標點 Q = k × G,其中 k ∈ [1, n-1],求 k 的問題即為離散對數問題。

為何 ECDLP 難以破解

  1. 沒有已知的多項式時間算法:傳統計算機上解決 ECDLP 沒有類似 Shor 算法的捷徑
  2. 指數級複雜度:最佳已知攻擊需要 O(√n) 次曲線運算,對 secp256k1 約為 2^128 次
  3. 群結構複雜:不同於整數離散對數,橢圓曲線的代數結構更複雜

安全性證明:生日攻擊的下界

對於 ECDLP 的通用攻擊時間複雜度為 O(√n),這來自生日攻擊(Birthday Attack)原理:

假設攻擊者隨機選擇 k₁ 個點並計算對應的 k₁ × G,存入列表 L₁;再隨機選擇 k₂ 個點並計算 k₂ × P(其中 P = k × G),檢查是否存在碰撞。

根據生日悖論,當 k ≈ √n 時,碰撞概率趨近於 50%。因此:

$$T_{birthday} = O(\sqrt{n}) = O(2^{128})$$

對 secp256k1 而言,n ≈ 2^256,需要約 2^128 次曲線點運算才能以 50% 概率找到離散對數。

安全性量化比較

安全等級RSA 金鑰長度ECC 金鑰長度破解時間(假設計算速度 10^12 ops/sec)
80-bit1024 bits160 bits約 1 年
128-bit3072 bits256 bits約 10^13 年
256-bit15360 bits512 bits約 10^38 年

比特幣使用的 256-bit ECC 提供約 128-bit 安全等級,遠超當前任何可預見的計算能力。

側信道攻擊與防護

純粹的 ECDLP 演算法雖然理論上安全,但實際實現可能存在側信道泄漏:

  1. 時間攻擊:不同輸入導致不同運算時間
  2. 功率分析:運算時的功率消耗洩露金鑰資訊
  3. 故障注入:故意引入錯誤獲得金鑰資訊

libsecp256k1(比特幣使用的密碼學庫)採用恆定時間演算法和功率分析防護:

// 恆定時間點加法實現(概念展示)
static void secp256k1_point_add_derivation(
    secp256k1_ge *r,
    const secp256k1_ge *a,
    const secp256k1_ge *b
) {
    // 使用恆定時間條件選擇,避免分支
    secp256k1_fe lam, x, y;
    secp256k1_fe_mul(&lam, &a->y, &b->x);
    secp256k1_fe_mul(&lam, &lam, &a->invert);
    // ... 所有運算均為恆定時間
}

私鑰與公鑰

比特幣的私鑰是一個 256 位元的隨機數,範圍在 1 到 n-1 之間,其中 n 是 secp256k1 曲線的階:

n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

私鑰 k 透過橢圓曲線點倍增運算生成公鑰 K:

K = k × G

其中 G 是 secp256k1 的生成點(Generator Point):

G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,
     0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)

這種運算的特殊性質是:從 K 推導 k(在離散對數問題上是不可行的)需要極大的計算量,這正是比特幣安全性的數學基礎。

數位簽章

ECDSA:比特幣的簽章算法

比特幣最初使用橢圓曲線數位簽章算法(Elliptic Curve Digital Signature Algorithm, ECDSA)進行交易簽章。ECDSA 是 DSA 的橢圓曲線變體,利用橢圓曲線離散對數問題的安全性。

簽章生成過程:

  1. 選擇隨機 nonce k(必須完全隨機且不可預測)
  2. 計算曲線點 (x₁, y₁) = k × G
  3. 計算 r = x₁ mod n
  4. 計算 s = k⁻¹ (hash(m) + r × privateKey) mod n
  5. 簽章為 (r, s) 對

關鍵安全考量:nonce k 的選擇至關重要。如果 k 被重複使用或可預測,攻擊者可以從簽章中推導出私鑰。歷史上多起比特幣盜竊事件都與不當的 nonce 生成有關。

Schnorr 簽章

2021 年 Taproot 升級後,比特幣引入了 Schnorr 簽章作為 ECDSA 的替代方案。Schnorr 簽章相比 ECDSA 具有以下優勢:

  1. 線性驗證:多個簽章可以聚合為單一簽章,實現簽章聚合
  2. 更簡單的數學結構:安全性證明更簡潔
  3. 批量驗證效率:多個簽章可以一次性驗證

Schnorr 簽章的基本結構:

R = k × G
e = Hash(R || Message)
s = k + e × privateKey
簽章 = (R, s)

MuSig2 聚合簽章

MuSig2 是一種 Schnorr 多簽章方案,允許多個參與者共同產生一個聚合公鑰和一個聚合簽章。這對於閃電網路等需要多方參與的應用場景特別有用。

Base58Check 編碼

比特幣地址和私鑰使用 Base58Check 編碼,這是一種專為比特幣設計的編碼方式:

Base58 字元集:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

常見問題

如果量子計算機能否破解比特幣?

量子電腦對比特幣的威脅主要體現在兩個方面:

  1. Shor 算法:可以在多項式時間內從公鑰推導出私鑰
  2. Grover 算法:可以加速哈希碰撞搜索

應對措施包括:

為什麼比特幣選擇 secp256k1 而非 NIST 推薦的曲線?

secp256k1 的選擇有以下原因:

私鑰真的無法被暴力破解嗎?

私鑰的空間為 2^256,遠大於可觀測宇宙中的原子數量(約 2^250)。即使使用地球上所有計算資源,也需要數百萬年才能暴力破解一個私鑰。這種安全性基於離散對數問題的計算難度。


參考來源

比特幣白皮書與技術文件

  1. 比特幣白皮書 - 密碼學理論基礎
  2. Bitcoin Optech - Schnorr Signatures
  3. BIP-340: Schnorr Signatures for secp256k1

密碼學標準

  1. FIPS 180-4: Secure Hash Standard
  2. ANSI X9.62: ECDSA 標準
  3. RFC 6979: Deterministic ECDSA

學術論文

  1. Certicom Research, "Standards for Efficient Cryptography - SEC 2: Recommended Elliptic Curve Domain Parameters"
  2. Peter Shor, "Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer"

開源實現

  1. Bitcoin Core - secp256k1 庫
  2. libsecp256k1

更新日期:2026-02-23

版本:1.0

本文為比特幣密碼學基礎系列文章之一,建議後續閱讀「比特幣共識機制」與「比特幣腳本語言」。

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!