比特幣密碼學基礎:SHA-256、ECDSA 與 secp256k1 橢圓曲線數學原理深度推導

從嚴格的數學角度深入推導比特幣密碼學機制的原理。涵蓋 SHA-256 Merkle-Damgård 結構與生日攻擊複雜度、secp256k1 橢圓曲線群運算與 ECDLP 困難性、Pollard's Rho 算法分析、MOV 攻擊與 Pohlig-Hellman 攻擊、ECDSA 簽名生成與驗證的數學推導、Schnorr 簽名與 Taproot 的密碼學基礎、以及比特幣密碼學安全最佳實踐。

比特幣密碼學基礎:SHA-256、ECDSA 與 secp256k1 橢圓曲線數學原理深度推導

概述

比特幣的密碼學安全性建立在幾個經過數十年研究的數學難題之上。這些密碼學原語——密碼學哈希函數 SHA-256、橢圓曲線密碼學(特別是 secp256k1 曲線)、以及數位簽名演算法(ECDSA 和 Schnorr)——共同構成了比特幣的安全邊界。本篇文章將從嚴格的數學角度,深入推導這些密碼學機制的原理,揭示其安全性的理論基礎,並探討其與比特幣具體應用的對應關係。

本文的目標讀者是具備抽象代數和密碼學基礎的技術讀者。我們將使用形式化的數學語言,確保每一步推導都有嚴格的理論依據。

第一部分:密碼學哈希函數的數學基礎

1.1 哈希函數的形式化定義

定義 1.1(密碼學哈希函數)

設 H : {0,1}* → {0,1}^n 為一個確定的多項式時間可計算函數,稱 H 為一個密碼學哈希函數,若其滿足以下安全性屬性:

  1. 原像抵抗性(Pre-image Resistance)

對給定輸出 y ∈ {0,1}^n,計算上不可行找到輸入 x 使得 H(x) = y。

即:對於所有 PPT(Probabilistic Polynomial Time)算法 A,

Pr[A(y) = x such that H(x) = y] < ε(n),其中 ε 為可忽略函數。

  1. 第二原像抵抗性(Second Pre-image Resistance)

對給定輸入 x,計算上不可行找到 x' ≠ x 使得 H(x') = H(x)。

即:對於所有 PPT 算法 A,

Pr[A(x) = x' such that x' ≠ x and H(x') = H(x)] < ε(n)。

  1. 碰撞抵抗性(Collision Resistance)

計算上不可行找到任意兩個不同的輸入 x ≠ x' 使得 H(x) = H(x')。

即:對於所有 PPT 算法 A,

Pr[(x, x') ← A : x ≠ x' and H(x) = H(x')] < ε(n)。

定理 1.1(碰撞抵抗性蘊含第二原像抵抗性)

若 H 是碰撞抵抗的,則 H 也是第二原像抵抗的。

證明

假設存在第二原像攻擊算法 A2。構造碰撞攻擊算法 A 如下:

Pr[A 成功] = Pr[A2 成功] × 1

因此,若 H 不是第二原像抵抗的,則 A 可以以不可忽略的概率找到碰撞,矛盾於碰撞抵抗性假設。 Q.E.D.

1.2 SHA-256 演算法的數學結構

1.2.1 Merkle-Damgård 結構

SHA-256 採用 Merkle-Damgård 結構,這是一種將任意長度輸入轉換為固定長度输出的經典方法。

定義 1.2(Merkle-Damgård 結構)

設 f : {0,1}^n × {0,1}^c → {0,1}^n 為一個碰撞抵抗的壓縮函數,其中 n 為輸出長度,c 為區塊長度。則 Merkle-Damgård 哈希函數 H : {0,1}* → {0,1}^n 定義為:

H(M) = IV  // 初始向量
for i = 1 to t:
    H_i = f(H_{i-1}, M_i)  // M_i 為第 i 個 c 位元組區塊
return H_t

其中消息 M 被填充至 c 位元組的倍數。

定理 1.2(Merkle-Damgård 安全性傳遞)

若 Merkle-Damgård 結構中的壓縮函數 f 是碰撞抵抗的,則整個哈希函數 H 也是碰撞抵抗的。

證明概述

假設存在碰撞 (M, M') 使得 H(M) = H(M')。設 M = M1 || M2 || ... || M_t,則存在最小的 j 使得:

根據構造,碰撞 (M, M') 可以轉化為壓縮函數 f 的碰撞:

其中 H{j-1} = H'{j-1}(由最小的 j 的選擇決定)。這給出了壓縮函數的碰撞,矛盾。 Q.E.D.

1.2.2 SHA-256 壓縮函數的數學描述

SHA-256 的壓縮函數 f : {0,1}^256 × {0,1}^512 → {0,1}^256 可表示為:

f(H, M) = CF(H, M) = Σ_1(H) + Ch(H, M) + K_i + M_i + Σ_0(M_i)

其中:

這些函數的設計遵循以下原則:

  1. 非線性性:使用 XOR、AND、NOT 等布爾運算的組合,確保沒有簡單的代數表達
  2. 雪崩效應:每個位元的變化應影響約一半的輸出位元
  3. Diffusion:輸入的每一位元應影響多個輸出位元

1.2.3 SHA-256 初始哈希值的數學意義

SHA-256 的初始哈希值(IV)不是任意的,而是由前八個質數的平方根的小數部分的前 32 位元構成:

H_0[0] = floor(√p_1 × 2^32) mod 2^32
H_0[1] = floor(√p_2 × 2^32) mod 2^32
...

其中 p1, p2, ... 為前八個質數(2, 3, 5, 7, 11, 13, 17, 19)。

這種選擇的動機是:

  1. 均勻分佈:質數的平方根在 [0,1] 區間均勻分佈
  2. 無結構:不存在簡單的代數關係連接這些常數
  3. 可驗證性:任何人都可以獨立驗證這些值的正確性

1.3 生日攻擊與碰撞複雜度

定理 1.3(生日攻擊的下界)

設 H : {0,1}* → {0,1}^n 為哈希函數。若攻擊者可以均勻隨機地選擇 q 個輸入,則找到碰撞的概率至少為:

Pr[碰撞存在] ≥ 1 - exp(-q(q-1) / 2^(n+1))

推論

當 q ≈ √(2^(n+1) × ln(1/(1-ε))) 時,碰撞概率約為 ε。

對於 n = 256:

生日悖論的直觀理解

若一年有 N = 365 天,每間教室有 k 個學生。當 k(k-1) ≈ 2N 時,教室中存在至少一對同生日學生的概率約為 1/2。

這個悖論的關鍵在於:我們不是在比較每個學生的生日與某個固定日期,而是在比較所有學生之間的生日對。

第二部分:橢圓曲線密碼學的數學基礎

2.1 橢圓曲線的代數結構

2.1.1 定義與基本性質

定義 2.1(橢圓曲線)

設 K 為一個域(本文主要討論 K = F_p,其中 p 為大質數)。定義在 K 上的橢圓曲線為:

E(K) = {(x, y) ∈ K × K | y² = x³ + ax + b} ∪ {O}

其中 a, b ∈ K,且滿足 4a³ + 27b² ≠ 0(確保曲線光滑,無奇點)。

曲線 E(K) 配備一個 Abel 群結構,O 為單位元(無窮遠點)。

secp256k1 的參數

比特幣使用的 secp256k1 曲線定義為:

y² = x³ + 7 (mod p)

其中:

p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
  = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F

這是一個質數階有限域上的曲線,其參數由 SEC 2 標準定義。

2.1.2 群運算的代數公式

點加法(P + Q)

設 P = (x1, y1),Q = (x2, y2),且 P ≠ ±Q。則 R = P + Q = (x3, y3) 由下式給出:

λ = (y_2 - y_1) / (x_2 - x_1) mod p
x_3 = λ² - x_1 - x_2 mod p
y_3 = λ(x_1 - x_3) - y_1 mod p

點倍增(2P)

設 P = (x1, y1) ≠ O。則 R = 2P = (x3, y3) 由下式給出:

λ = (3x_1² + a) / (2y_1) mod p
x_3 = λ² - 2x_1 mod p
y_3 = λ(x_1 - x_3) - y_1 mod p

對於 secp256k1,a = 0,簡化為:

λ = 3x_1² / (2y_1) mod p

2.1.3 標量乘法的計算複雜度

定義 2.2(標量乘法)

設 k ∈ Z 為一個正整數,P ∈ E(K)。定義 kP 為 k 個 P 相加:

kP = P + P + ... + P (k times)

二分冪展開法(Double-and-Add)

任意 k 可以唯一表示為二進位:

k = Σ_{i=0}^{⌊log₂k⌋} b_i × 2^i,b_i ∈ {0, 1}

標量乘法計算:

result = O
for i from most significant bit to least significant bit:
    result = 2 * result
    if b_i = 1:
        result = result + P
return result

定理 2.1(二分冪展開法的複雜度)

二分冪展開法計算 kP 需要 O(log k) 次點加法和 O(log k) 次點倍增。

證明

k 的二進位表示長度為 ⌊log₂k⌋ + 1 位元。算法的每次迭代:

  1. 恰好執行一次點倍增(O(1))
  2. 執行一次點加法的概率為 1/2

因此總複雜度為 O(log k)。 Q.E.D.

2.2 離散對數問題的形式化

2.2.1 橢圓曲線離散對數問題

定義 2.3(ECDLP)

設 E 為定義在有限域 Fq 上的橢圓曲線,G ∈ E(Fq) 為一個生成元(由 G 生成的循環子群的階為大質數 n)。離散對數問題(DLP in E)是:

給定 Q ∈ ⟨G⟩,找到唯一的整數 k ∈ [0, n-1] 使得 Q = kG。

定義 2.4(ECDLP 的困難性假設)

對於所有 PPT 算法 A,存在可忽略函數 ε(n) 使得:

Pr[A(E, G, q, Q) = k such that Q = kG] < ε(n)

其中 n ≈ 2^256 為 secp256k1 的階。

2.2.2 Pollard's Rho 算法的複雜度分析

Pollard's Rho 是目前已知最快的通用 ECDLP 求解算法。

算法概述

Pollard's Rho 通過構造一個偽隨機序列來尋找碰撞。核心思想是:

  1. 構造一個函數 f : ⟨G⟩ → ⟨G⟩
  2. 序列 xi = f(x{i-1}) 在 ⟨G⟩ 上Pseudo-random行走
  3. 當 xi = xj 時(碰撞),可以恢復離散對數

定理 2.2(Pollard's Rho 的期望複雜度)

Pollard's Rho 算法的期望運行時間為 O(√n) 次群運算。

證明概述

根據Birthday Paradox,在一個大小為 n 的集合中,期望在 O(√n) 步後出現碰撞。Pollard's Rho 構造的序列在 ⟨G⟩ 中Pseudo-random行走,因此其碰撞期望同樣為 O(√n)。 Q.E.D.

數值估算

對於 secp256k1,n ≈ 2^256:

√n = 2^128 ≈ 3.4 × 10^38

這意味著即使使用全世界所有的計算資源,
也需要約 10^20 年才能破解 ECDLP。

2.3 MOV 攻擊與 Pohlig-Hellman 攻擊

2.3.1 MOV 攻擊

定義 2.4(Weil 配對)

對於定義在有限域上的橢圓曲線,Weil 配對是一個雙線性映射:

e_m : E[m] × E[m] → F*_(q^m)

其中 E[m] = {P ∈ E | mP = O}。

MOV 攻擊原理

給定 Q = kG,可以利用 Weil 配對將 ECDLP 轉化為有限域上的普通離散對數問題:

1. 選擇一個點 P ∈ E[m]
2. 計算 e_m(Q, P) = e_m(kG, P) = e_m(G, P)^k
3. 令 α = e_m(Q, P),β = e_m(G, P)
4. 現在的問題是:已知 α = β^k,求 k
5. 這是有限域 F*_q 上的 DLP,可以使用指數微積分或其他算法求解

定理 2.3(MOV 攻擊的有效性條件)

MOV 攻擊的有效性取決於曲線的嵌入度 m。攻擊複雜度為 O(q^(m/2))。

對於 secp256k1:

2.3.2 Pohlig-Hellman 攻擊

定理 2.4(Pohlig-Hellman 攻擊)

若群 ⟨G⟩ 的階 n 不是素數,而是具有小質因數,則可以將 ECDLP 降維。

證明概述

設 n = ∏{i=1}^r pi^{ei} 為 n 的質因數分解。對於每個 pi:

  1. 計算 Qi = (n/pi^{e_i})Q
  2. 計算 Gi = (n/pi^{e_i})G
  3. Qi = ki Gi,其中 ki ∈ Z/pi^{ei}Z
  4. 求解 k_i(使用中國剩餘定理擴展)

最終通過中國剩餘定理合併 k_i 得到 k。

secp256k1 的免疫性

secp256k1 的階:

n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

這是一個大素數,因此 Pohlig-Hellman 攻擊對 secp256k1 無效。

第三部分:ECDSA 簽名方案

3.1 ECDSA 的數學定義

3.1.1 參數與金鑰生成

ECDSA 參數集

D = (q, a, b, G, n, h)

其中:
- q:有限域的大小(對於 secp256k1,q = p)
- a, b:曲線係數(對於 secp256k1,a = 0, b = 7)
- G:基點(generator)
- n:基點的階(為素數)
- h:餘因子(cofactor,對於 secp256k1,h = 1)

金鑰生成

1. 選擇均勻隨機的私鑰 d ∈ [1, n-1]
2. 計算公鑰 Q = dG
3. 公開 (D, Q),保密 d

3.1.2 簽名生成

算法 3.1(ECDSA 簽名生成)

輸入:私鑰 d,消息 m
輸出:(r, s) 簽名

1. 計算消息哈希:e = H(m)
2. 將 e 轉換為整數:e ∈ [0, n-1]
3. 重複以下步驟直到找到有效簽名:
   a. 選擇均勻隨機的 k ∈ [1, n-1]
   b. 計算點 (x_1, y_1) = kG
   c. 計算 r = x_1 mod n
   d. 若 r = 0,返回步驟 3a
   e. 計算 s = k^(-1) × (e + r×d) mod n
   f. 若 s = 0,返回步驟 3a
4. 返回簽名 (r, s)

k 的重要性

k 必須是完全保密且每次簽名都不同。相同的 k 會導致私鑰暴露:

定理 3.1(重用 k 的危險性)

若使用相同的 k 簽署兩個不同的消息,攻擊者可以恢復私鑰。

證明

假設有兩個簽名 (r, s1) 和 (r, s2),分別來自消息哈希 e1 和 e2:

s_1 = k^(-1)(e_1 + r×d) mod n
s_2 = k^(-1)(e_2 + r×d) mod n

兩式相減:

s_1 - s_2 = k^(-1)(e_1 - e_2) mod n
k = (e_1 - e_2)(s_1 - s_2)^(-1) mod n

然後:

d = (s×k - e) × r^(-1) mod n

因此,一旦 k 已知,私鑰 d 可以立即計算。 Q.E.D.

3.1.3 簽名驗證

算法 3.2(ECDSA 簽名驗證)

輸入:公鑰 Q,消息哈希 e,簽名 (r, s)
輸出:Valid 或 Invalid

1. 驗證 r, s ∈ [1, n-1]
2. 計算 w = s^(-1) mod n
3. 計算 u_1 = e×w mod n
4. 計算 u_2 = r×w mod n
5. 計算點 (x_1, y_1) = u_1×G + u_2×Q
6. 若 (x_1, y_1) = O,返回 Invalid
7. 計算 v = x_1 mod n
8. 若 v = r,返回 Valid;否則返回 Invalid

定理 3.2(ECDSA 驗證的正確性)

若 (r, s) 是由私鑰 d 和消息哈希 e 生成的合法簽名,則驗證算法恆返回 Valid。

證明

由簽名生成定義:

s = k^(-1)(e + r×d) mod n

移項:

k = (e + r×d)s^(-1) mod n

在驗證算法中:

u_1 = e×s^(-1) mod n
u_2 = r×s^(-1) mod n

計算:
u_1×G + u_2×Q = (e×s^(-1))×G + (r×s^(-1))×(d×G)
               = s^(-1)(e + r×d)G
               = kG

因此,計算得到的點滿足 x_1 mod n = r,故驗證成功。 Q.E.D.

第四部分:secp256k1 的數學特性

4.1 曲線參數的選擇標準

選擇標準 1:安全性

secp256k1 的參數選擇滿足以下安全標準:

  1. 群階為大素數:確保 Pohlig-Hellman 攻擊無效
  2. 嵌入度 m 很大:確保 MOV 攻擊無優勢
  3. 非超奇異:避免 mov 攻擊的有效變體
  4. 非異常曲線:|E(F_p)| ≠ p(避免 Smart's attack)

選擇標準 2:效率

  1. 較小的場特徵:p ≈ 2^256,在 32 位元架構上易於優化
  2. 簡化的曲線方程:y² = x³ + b(非一般的 y² = x³ + ax + b),減少乘法運算
  3. 高階的 2-adicity:便於使用快速的 Fourier 變換優化標量乘法

選擇標準 3:可驗證隨機性

基點 G 的選擇方式確保其不是研究者預先構造的:

G = (Gx, Gy)

Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
Gy = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

這些值是 SHA-256 哈希值,可由任何人獨立驗證。

4.2 標量乘法的優化實現

窗口 NAF 方法

不使用普通的二進位表示,而是使用非相鄰形式(Non-Adjacent Form, NAF):

NAF 特性:
- 每個位置為 {0, 1, -1}
- 不存在兩個連續的非零位
- 稀疏表示減少點加法次數

定理 4.1(NAF 的 Hamming 重量)

對於均勻隨機的標量 k,其 NAF 表示的平均 Hamming 重量為 |k|/3。

這比二進位表示的平均重量 |k|/2 更小。

蒙哥馬利階梯(Montgomery Ladder)

這是一種恆定時間的標量乘法實現,對抵禦側通道攻擊至關重要:

Montgomery Ladder(P, k):
    R_0 = O
    R_1 = P
    for i from 0 to m-1:
        b = k_i  // k 的第 i 位
        R_{1-b} = R_0 + R_1
        R_b = 2 * R_b
    return R_0

恆定時間特性

無論 k 的位元為 0 或 1,Montgomery Ladder 執行完全相同數量的運算,且操作順序相同。這防止了時間側通道攻擊。

第五部分:Schnorr 簽名與 Taproot

5.1 Schnorr 簽名的數學定義

5.1.1 與 ECDSA 的數學對比

ECDSA 簽名結構

(r, s) 其中:
- r:從 kG 的 x 座標取模 n
- s:k^(-1)(e + rd) mod n

Schnorr 簽名結構

(s, e) 其中:
- e:Hash(R || P || m)
- s = k + e×d mod n

5.1.2 BIP-340 Schnorr 簽名

比特幣採用的 Schnorr 簽名標準(BIP-340)定義如下:

金鑰對

私鑰:x ∈ [1, n-1]
公鑰:P = x×G

注意:BIP-340 使用未壓縮的 x-only 公鑰
(即只包含 P 的 x 座標,不包含 y 座標)

簽名生成

1. 選擇 k ∈ [1, n-1]  uniform random
2. 計算 R = k×G
3. 令 r = R.x mod n(只使用 x 座標)
4. 計算 e = Hash(r || P || m) mod n
5. 計算 s = k + e×x mod n
6. 返回簽名 (s, e)  // 注意順序與 ECDSA 相反

簽名驗證

驗證等式:s×G ≟ R + e×P

因為:
s×G = (k + e×x)G = kG + e×xG = R + e×P

5.2 Schnorr 簽名的優勢

5.2.1 線性簽名驗證

定理 5.1(Schnorr 簽名的批量驗證)

對於多個 Schnorr 簽名,可以同時驗證而無需分別驗證每個簽名。

證明

設有 n 個簽名 (si, ei),對應公鑰 Pi 和消息 mi:

驗證等式:s_i×G ≟ R_i + e_i×P_i

其中 R_i.x = r_i,e_i = Hash(r_i || P_i || m_i)

若所有簽名有效,則:

Σ λ_i × s_i×G = Σ λ_i × (R_i + e_i×P_i)

其中 λ_i 為任意選擇的係數。右側需要 n 次點加法和 n 次點乘法定點乘法,可以批量優化。

5.2.2 鑰匙聚合

定理 5.2(2-of-2 Schnorr 簽名聚合)

兩個參與者可以將他們的私鑰聚合為一個聚合私鑰,產生可以被聚合公鑰驗證的簽名。

方案

聚合私鑰:x_agg = x_1 + x_2 mod n
聚合公鑰:P_agg = P_1 + P_2 = x_agg×G

簽名生成:
1. 每個參與者選擇 k_i
2. 計算 R_i = k_i×G
3. 計算 R = R_1 + R_2
4. 計算 e = Hash(R.x || P_agg || m) mod n
5. 計算 s_i = k_i + e×x_i mod n
6. 聚合 s = s_1 + s_2 mod n
7. 簽名為 (s, e)

驗證:
s×G = (k_1 + k_2 + e×(x_1 + x_2))G
    = R_1 + R_2 + e×P_agg
    = R + e×P_agg

安全特性

旁觀者無法區分 2-of-2 簽名與 1-of-1 簽名,也不知道有多少參與者。

5.3 Taproot 的密碼學基礎

5.3.1 BIP-341 Taproot 定義

內部公鑰與腳本樹

Taproot 位址由以下元素構成:

內部公鑰:Q_internal
腳本承諾:tweak = Hash(Q_internal || tapscript_root)
Taproot 公鑰:Q = Q_internal + tweak×G

其中 tapscript_root 是所有可能花費路徑的 Merkle 根。

花費路徑

  1. 金鑰路徑:使用 Q 的私鑰(Q_internal + tweak)直接簽名
  2. 腳本路徑:揭示特定葉片腳本及其 Merkle 證明

5.3.2 Taproot 的隱私性

定理 5.3(Taproot 的不可區分性)

對於任意 Taproot 位址,旁觀者無法確定其花費條件是:

證明

任何 Taproot 位址的格式與普通公鑰相同:

因此,所有 Taproot 花費在區塊鏈上看起來都一樣,提供了完美的隱私性。

結論

比特幣的密碼學基礎建立在經過數十年研究的數學難題之上:

  1. SHA-256 的碰撞抵抗性基於 SHA-2 家族的結構安全性,其 2^128 碰撞攻擊複雜度提供了充足的安全邊際。
  1. secp256k1 曲線的選擇平衡了安全性和效率:大素數階確保 Pohlig-Hellman 攻擊無效,而特殊的曲線方程簡化了計算。
  1. ECDSASchnorr 簽名方案的安全性依賴於 ECDLP 的困難性,這是 secp256k1 曲線的根本安全假設。
  1. Taproot 升級通過 Schnorr 簽名的線性特性,實現了複雜比特幣合約與簡單交易的不可區分性,顯著提升了隱私性。

理解這些密碼學機制的數學原理,對於評估比特幣的長期安全性和參與比特幣協議的演進具有重要意義。隨著密碼學研究的進展和量子計算的威脅日益臨近,比特幣社群必須持續監測新威脅並準備必要的技術遷移方案。

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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