橢圓曲線密碼學基礎:以太坊簽章機制與零知識證明的數學理論

橢圓曲線密碼學(ECC)是現代密碼學的基石,也是比特幣和以太坊所採用的核心密碼學技術。secp256k1 曲線被用於以太坊的交易簽章,BLS 簽名在共識層發揮關鍵作用,而零知識證明系統(如 zk-SNARK、zk-STARK)則構建於橢圓曲線配對之上。本文將從數學原理出發,深入解析橢圓曲線密碼學的理論基礎,闡述離散對數問題的複雜性如何保障系統安全,並詳細說明這些理論如何應用於以太坊的各類密碼學實踐。

橢圓曲線密碼學基礎:以太坊簽章機制與零知識證明的數學理論

摘要

橢圓曲線密碼學(Elliptic Curve Cryptography, ECC)是現代密碼學的基石,也是比特幣和以太坊所採用的核心密碼學技術。secp256k1 曲線被用於以太坊的交易簽章,BLS 簽名在共識層發揮關鍵作用,而零知識證明系統(如 zk-SNARK、zk-STARK)則構建於橢圓曲線配對之上。本文將從數學原理出發,深入解析橢圓曲線密碼學的理論基礎,闡述離散對數問題的複雜性如何保障系統安全,並詳細說明這些理論如何應用於以太坊的各類密碼學實踐。

一、橢圓曲線的數學基礎

1.1 橢圓曲線的定義與性質

橢圓曲線(Elliptic Curve)並非橢圓形狀的曲線,而是一類具有特殊代數結構的平面代數曲線。一條橢圓曲線可以用以下魏爾斯特拉斯形式(Weierstrass Form)定義:

y² = x³ + ax + b

其中 a 和 b 是滿足判別式條件的常數:

Δ = 4a³ + 27b² ≠ 0

這個條件確保曲線是「非奇異」的,即曲線上沒有尖點或自交點,這是橢圓曲線具有良好代數性質的前提。

以太坊和比特幣使用的 secp256k1 曲線具有以下參數:

a = 0
b = 7
p = 2²⁵⁶ - 2³² - 2⁹ - 2⁶ - 2⁴ - 2⁰ - 1
n = 115792089237316195423570985008687907852837564279074904382605163141518161494337
G = (55066263022277343669578718895168534326250603453777594175500187360389116729240,
     3267051002075881697808308513050704318447127338065924327593890353575238778423702)

1.2 有限域上的橢圓曲線

密碼學應用中使用的橢圓曲線並非定義在實數域上,而是定義在有限域(Finite Field)中。secp256k1 使用的是一個大質數域 Fp,其中 p 是一個 256 位的質數。

有限域上的橢圓曲線定義為:

E(Fp): y² ≡ x³ + ax + b (mod p)

這種定義方式帶來了幾個重要特性:

有限性:曲線上的點的數量是有限的(由 Hasse 定理給出範圍)。這使得枚舉攻擊變得不可行。

交換性:有限域上的橢圓曲線點群是一個交換群(阿貝爾群),這個群結構是設計密碼學協議的基礎。

非線性:離散對數問題在有限域上的橢圓曲線群中被認為是計算困難的,這一困難性是 ECC 安全性的根本保障。

1.3 點的運算規則

橢圓曲線密碼學的安全性建立在點群的代數結構之上。定義在橢圓曲線上的點可以進行兩種運算:

點加法(Point Addition):對於曲線上兩個不同的點 P 和 Q,連接它們的直線必然與曲線交於第三個點 R。將 R 關於 x 軸反射得到的點 R' 即為 P + Q。

代數公式(對於 P ≠ Q):

設 P = (x₁, y₁), Q = (x₂, y₂), P ≠ Q
斜率 λ = (y₂ - y₁) / (x₂ - x₁) (mod p)

R = P + Q = (x₃, y₃)
x₃ = λ² - x₁ - x₂ (mod p)
y₃ = λ(x₁ - x₃) - y₁ (mod p)

倍點運算(Point Doubling):當 P = Q 時,需要計算 2P。設 P 點的切線斜率為 λ:

設 P = (x₁, y₁), 且 y₁ ≠ 0
斜率 λ = (3x₁² + a) / (2y₁) (mod p)

R = 2P = (x₃, y₃)
x₃ = λ² - 2x₁ (mod p)
y₃ = λ(x₁ - x₃) - y₁ (mod p)

恆等元素與逆元素

1.4 群的階與基點的選擇

橢圓曲線群的階(Order)是指群中元素的個數。對於密碼學應用,我們通常選擇一個具有大質數階的子群:

n = #E(Fp)  // 群的階
G = 基點,生成 n 階循環子群
h = #E(Fp) / n  // 餘因子(通常為 1)

對於 secp256k1:

選擇大質數階子群的原因是:當群的階是質數時,離散對數問題在該群中是最難求解的。

二、離散對數問題與安全性

2.1 離散對數問題的定義

橢圓曲線離散對數問題(ECDLP, Elliptic Curve Discrete Logarithm Problem)可以形式化定義為:

給定:

求解:

這個問題在數學上被認為是「困難」的——目前沒有已知的多項式時間算法可以在經典計算機上高效求解 ECDLP。對於一個 256 位的曲線(如 secp256k1),暴力搜索需要枚舉約 2^128 個可能的私鑰,這在計算上是不可行的。

2.2 為什麼 ECDLP 是困難的

ECDLP 的困難性源於橢圓曲線點群的代數結構與有限域乘法群的根本差異:

Pollard's ρ 算法的複雜度:O(√n) ≈ 2^128 次操作

Baby-step Giant-step 算法的複雜度:O(√n) 時間,O(√n) 空間

這些算法代表了對 ECDLP 的最佳已知攻擊,其複雜度都與 √n 成正比。對於 secp256k1 的 256 位質數階子群,這意味著約 2^128 步操作——即使使用世界上最強大的超級電腦,也要花費比宇宙年齡更長的時間才能破解。

相比之下,整數分解問題(如 RSA 的安全性基礎)可以使用數域篩法(Number Field Sieve)在亞指數時間內求解,這使得 RSA 需要使用更大的密鑰來達到同等安全級別:

安全強度RSA 密鑰長度ECC 密鑰長度
80 bits1024 bits160 bits
128 bits3072 bits256 bits
256 bits15360 bits512 bits

這種密鑰長度的效率優勢是 ECC 被廣泛採用的重要原因之一。

2.3 量子計算的威脅

Shor 算法的出現對 ECC 的安全性構成了理論上的威脅。量子計算機可以在多項式時間內求解離散對數問題,這意味著在實用量子電腦問世後,基於 ECDLP 的密碼系統將被完全破解。

量子算法對不同密碼系統的影響:

Grover 算法:提供 2^(n/2) 的加速,可將 AES-256 的安全性降低到 AES-128 級別。

Shor 算法:對離散對數問題(包括 ECDLP)提供指數級加速,徹底破解基於離散對數的密碼系統(RSA、ECC、Diffie-Hellman)。

對 ECC 的具體威脅:

這個威脅促使以太坊社區積極研究後量子密碼學遷移方案,包括 CRYSTALS-Dilithium(基於格密碼學)和 SPHINCS+(基於哈希簽名)等替代方案。

三、以太坊的 secp256k1 簽章機制

3.1 ECDSA 簽章演算法

以太坊使用 ECDSA(Elliptic Curve Digital Signature Algorithm)作為主要的交易簽章機制。ECDSA 是 NIST 標準化的橢圓曲線簽章算法,被比特幣、以太坊以及眾多區塊鏈項目廣泛採用。

ECDSA 簽名過程:

輸入:
- 私鑰 d ∈ [1, n-1]
- 消息 m 的哈希 z = Hash(m) 的前 n 位
- 曲線參數 (p, a, b, G, n, h)

簽名生成:
1. 選擇隨機數 k ∈ [1, n-1]
2. 計算點 R = k × G = (x₁, y₁)
3. 計算 r = x₁ mod n(若 r = 0,重新選擇 k)
4. 計算 s = k⁻¹(z + rd) mod n(若 s = 0,重新選擇 k)
5. 返回簽名 (r, s)

簽名驗證過程:

輸入:
- 公鑰 Q = d × G
- 消息哈希 z
- 簽名 (r, s)

驗證步驟:
1. 驗證 r, s ∈ [1, n-1]
2. 計算 w = s⁻¹ mod n
3. 計算 u₁ = zw mod n, u₂ = rw mod n
4. 計算點 P = u₁ × G + u₂ × Q
5. 若 P = O,拒絕簽名
6. 計算 v = P.x mod n
7. 若 v = r,接受簽名;否則拒絕

3.2 secp256k1 的特性與安全性

secp256k1 曲線是 SECG(Standards for Efficient Cryptography Group)標準化的一條特殊曲線,其設計具有幾個顯著特點:

參數 a = 0:這個特殊的參數選擇使得曲線方程變為 y² = x³ + 7,簡化了計算並可能提供更好的效率。

p ≡ 1 mod 3 的特殊結構:這個質數具有數論上的特殊結構,可能對某些側信道攻擊提供更好的抵抗能力。

非密碼學家友好曲線:不同於 NIST 推薦的 P-256 等曲線(其參數來源存在爭議),secp256k1 的參數是通過確定性方法生成的,確保沒有後門。

ECDSA 的安全性已經過多年的密碼分析檢驗,截至 2026 年,沒有發現實際可行的 ECDLP 求解方法。然而,ECDSA 對實現的安全性高度敏感,需要防範以下攻擊向量:

側信道攻擊:通過分析執行時間、功耗、電磁輻射等物理信息推斷私鑰。需要使用恆定時間實現和盲化技術防禦。

Nonce 重用攻擊:如果相同的 k 值被用於兩個不同的消息簽名,攻擊者可以直接從兩個簽名中恢復私鑰。k 必須使用安全的隨機數生成器或 RFC 6979 確定性生成。

曲線選擇攻擊:某些橢圓曲線可能存在特殊的代數結構使得離散對數問題變得容易。secp256k1 經過驗證不具有這類弱點。

3.3 以太坊交易簽章的實際流程

以太坊交易的 ECDSA 簽章過程可以分解為以下步驟:

1. 構造交易內容
   transaction = {
       nonce,
       gasPrice,
       gasLimit,
       to,
       value,
       data,
       chainId,
       accessList,
       maxPriorityFeePerGas,
       maxFeePerGas
   }

2. 計算交易哈希(RLP 編碼後的 Keccak-256)
   txHash = keccak256(rlp_encode(transaction))

3. 計算簽名
   (v, r, s) = ecdsa_sign(txHash, privateKey)
   // v 編碼了鏈 ID 和奇偶校驗信息

4. 恢復簽名者地址
   recoveredAddress = ecrecover(txHash, v, r, s)
   // ecrecover 是 EVM 內置函數,基於簽名恢復公鑰和地址

ecrecover 函數基於 ECDSA 的簽名可恢復性特性:給定消息哈希、簽名 (r, s, v),可以唯一確定簽名者的公鑰(因為 ECDSA 的恢復涉及計算一個二次方程,有兩個可能的解,通過 v 參數區分)。

四、BLS 簽名與以太坊共識層

4.1 BLS 簽名機制

BLS 簽名(Boneh–Lynn–Shacham 簽名)是以太坊共識層使用的另一種橢圓曲線簽名方案,與 ECDSA 相比具有獨特的優勢。

BLS 簽名的核心思想是利用橢圓曲線配對(Pairing)來實現:

密鑰生成

簽名生成

簽名驗證

e(σ, G) = e(d × h, G)
        = e(h, d × G)
        = e(h, P)

配對 e: G₁ × G₂ → Gₜ 是橢圓曲線上的一個雙線性映射,具有以下性質:

e(a × P, b × Q) = e(P, Q)^(ab)  // 雙線性
e(P, Q) ≠ 1(一般情況)         // 非退化

4.2 BLS 在以太坊中的應用

以太坊共識層使用 BLS 簽名來驗證驗證者的投票和證明,這是因為 BLS 簽名具有以下特性:

簽名聚合(Signature Aggregation):多個 BLS 簽名可以高效地聚合成一個簽名,大幅減少驗證所需的工作量。

假設有 n 個驗證者,每個產生簽名 σᵢ = dᵢ × h
聚合簽名:Σ = σ₁ + σ₂ + ... + σₙ = (Σdᵢ) × h
驗證:e(Σ, G) = e(h, ΣPᵢ)  // 只需一次配對運算!

對於數千甚至數萬個驗證者的投票,BLS 簽名聚合可以將驗證成本從 O(n) 降低到 O(1)。

更快的驗證:相比 ECDSA 的多次點加法和配對操作,BLS 驗證只需要一次配對運算。

閾值簽名支持:BLS 天然支持閾值簽名方案,可以實現分散式的密鑰管理和多簽功能。

以太坊使用的 BLS 曲線是 BLS12-381,這是一條具有 381 位質數域的橢圓曲線,其配對友好性使其適合用於零知識證明系統。

4.3 以太坊共識層的簽名方案

以太坊權益證明共識機制(Casper FFG)使用 BLS 簽名實現以下功能:

質押存款證明:驗證者質押時提交 BLS 簽名來驗證其存款信息。

區塊提議投票:驗證者使用 BLS 簽名對區塊進行投票(Attestation)。

最終性確認:當 2/3 以上的驗證者對某個檢查點簽名確認後,該區塊具有最終性。

BLS 簽名在以太坊中的具體應用包括:

// 概念性的 BLS 簽名應用
validator_sign(attestation, private_key):
    hash = hash(attestation.data)
    signature = BLS_Sign(private_key, hash)
    return signature

verify_aggregate(aggregated_signature, attestations, validator_set):
    pubkeys = [get_pubkey(v) for v in attestations]
    aggregate_pubkey = sum(pubkeys)  // 聚合公鑰
    hash = hash_combine([a.data for a in attestations])
    return BLS_Verify(aggregate_pubkey, hash, aggregated_signature)

這種設計使得以太坊共識層可以在處理數十萬驗證者的投票時保持高效。

五、橢圓曲線配對與零知識證明

5.1 配對的數學基礎

橢圓曲線配對(Pairing)是將兩條橢圓曲線群中的元素映射到一個有限域的方法。密碼學中常用的配對類型包括:

Weil 配對:最初的數學配對定義,安全性高但效率較低。

Tate 配對和 Ate 配對:更高效的配對變體,用於實際密碼學應用。

對於一條橢圓曲線 E 和其嵌入度 k,配對將元素從 E(Fp) 和 E(Fpk) 映射到 Fpk*:

e: G₁ × G₂ → Gₜ

其中:
G₁ ⊆ E(Fp)[r]  // r 階子群
G₂ ⊆ E(Fpk)[r]  // Fpk 上 r 階子群
Gₜ = μr(Fpk*)   // r 階單位根群

5.2 配對的雙線性性質

配對的雙線性性質是其應用於零知識證明和其他密碼學協議的基礎:

e(P₁ + P₂, Q) = e(P₁, Q) · e(P₂, Q)    // 加法同態
e(P, Q₁ + Q₂) = e(P, Q₁) · e(P, Q₂)    // 加法同態
e(aP, bQ) = e(P, Q)^(ab)                // 雙線性

這個性質使得配對可以用於構建各類密碼學協議:

三方密鑰交換(Triangle Inequality)

5.3 配對在 zk-SNARK 中的應用

zk-SNARK(Zero-Knowledge Succinct Non-Interactive Arguments of Knowledge)是構建於橢圓曲線配對之上的零知識證明系統。Groth16 算法是應用最廣泛的 zk-SNARK 實現之一。

zk-SNARK 的核心組件包括:

代數電路(Algebraic Circuit):將計算問題轉換為多項式約束系統(R1CS)。

多項式承諾(Polynomial Commitment):使用配對進行多項式 Evaluation 的零知識驗證。

知識證明(Proof of Knowledge):利用離散對數問題的困難性來確保證明者知道見證(Witness)。

Groth16 的設置過程涉及生成 CRS(Common Reference String):

CRS = (G₁^s, G₂^s, ..., G₁^(s^d), G₂^(s^d), ..., G₁^(α), G₂^(β), G₁^(αs), ...)

其中 s 是秘密隨機數(有毒廢料,toxic waste)
α, β 是其他秘密隨機數

zk-SNARK 的證明和驗證過程:

證明者計算:
- A = α + Σ₀ + Σᵢ(vᵢ · witnessᵢ) + r × H
- B = β + Σ₀ + Σᵢ(wᵢ · witnessᵢ) + s × H
- C = Σ₀ + Σᵢ(uᵢ · witnessᵢ) + Σⱼₖ(vⱼ · wₖ · witnessⱼ · witnessₖ) + h × H
    - t(X) = Σᵢ uᵢ(X) · witnessᵢ + Σⱼₖ vⱼ(X) · wₖ(X) · witnessⱼ · witnessₖ - h(X) · t(X)
    - H(X) = t(X) / Z(X)

驗證者檢查:
e(A, B) = e(α, β) · e(Σ₀, Σ₀') · Πᵢ e(vᵢ^i, w⁰^i) · e(C, H⁰)

5.4 零知識電路的設計

zk-SNARK 電路的設計需要將計算轉換為約束系統。以太坊生態中常用的電路開發語言包括 Circom 和 Noir。

一個簡單的 Circom 電路示例:

pragma circom 2.0.0;

template Multiplier() {
    signal private input a;
    signal private input b;
    signal output c;
    
    c <== a * b;
}

component main = Multiplier();

這個電路證明電路設計者知道兩個數 a 和 b,使得它們的乘積等於公開輸出 c,而不需要透露 a 和 b 的具體值。

約束系統的生成涉及:

// 電路約束翻譯
a * b = c  →  a * b - c = 0  →  QAP 多項式約束

六、安全實踐與常見漏洞

6.1 側信道攻擊防禦

側信道攻擊利用密碼學實現的物理特性(如執行時間、功耗、電磁輻射)來推斷密鑰信息。

定時攻擊(Timing Attack)

電源分析攻擊(Power Analysis)

6.2 隨機數生成安全

ECDSA 對隨機數的要求極其嚴格。k 值的任何規律性都可能導致私鑰洩露。

Sony PlayStation 3 漏洞:2009-2010 年間,Sony PS3 的 ECDSA 實現重用了相同的 k 值,導致攻擊者可以恢復 ECDSA 私鑰。

Android 比特幣錢包漏洞:2013 年,Android 系統的 SecureRandom 實現存在缺陷,導致比特幣錢包的 ECDSA 簽名出現重複 k 值。

RFC 6979 確定性 k 生成

def deterministic_k(message_hash, private_key, nonce=0):
    """
    RFC 6979 確定性 k 生成
    避免依賴外部隨機數生成器
    """
    q = curve_order  # 曲線階
    h1 = message_hash
    
    # K = HMAC_K(V || INT(1) || bits2int(h1) || bits2int(h2) || INT(nonce))
    V = b'\x01' * 32  # 初始化向量
    K = b'\x00' * 32  # HMAC 密鑰
    
    K = hmac_sha256(K, V + b'\x00' + int2bytes(h1) + int2bytes(private_key) + int2bytes(nonce))
    V = hmac_sha256(K, V)
    K = hmac_sha256(K, V + b'\x01' + int2bytes(h1) + int2bytes(private_key) + int2bytes(nonce))
    V = hmac_sha256(K, V)
    
    # 根據 RFC 6979 迭代生成有效的 k
    while True:
        # ... k 生成邏輯
        if 1 <= k <= q - 1:
            return k

6.3 密鑰管理的最佳實踐

以太坊密鑰管理涉及以下安全最佳實踐:

冷熱錢包分離

多重簽名合約

contract MultiSigWallet {
    address[] public owners;
    uint public required;
    
    mapping(bytes32 => Transaction) public transactions;
    mapping(bytes32 => mapping(address => bool)) public confirmations;
    
    function submitTransaction(address destination, uint value, bytes memory data) 
        public 
        returns (bytes32 txHash) 
    {
        require(isOwner(msg.sender), "Not owner");
        txHash = keccak256(abi.encode(destination, value, data));
        transactions[txHash] = Transaction(destination, value, data, false);
        confirmations[txHash][msg.sender] = true;
    }
    
    function confirmTransaction(bytes32 txHash) public {
        require(isOwner(msg.sender));
        require(transactions[txHash].executed == false);
        confirmations[txHash][msg.sender] = true;
        executeTransaction(txHash);
    }
    
    function executeTransaction(bytes32 txHash) internal {
        if (getConfirmationCount(txHash) >= required) {
            Transaction storage txn = transactions[txHash];
            txn.executed = true;
            (bool success, ) = txn.destination.call{value: txn.value}(txn.data);
            require(success, "Execution failed");
        }
    }
}

結論

橢圓曲線密碼學是以太坊安全性和功能性的數學基石。從 secp256k1 的 ECDSA 簽章到 BLS 簽名,再到 zk-SNARK 零知識證明系統,橢圓曲線的代數結構為區塊鏈技術提供了堅實的安全保障。

理解 ECC 的數學原理對於深入理解以太坊的工作機制至關重要。secp256k1 的選擇、ECDSA 的實現細節、配對的雙線性性質——這些技術細節構成了以太坊密碼學安全的完整圖景。

展望未來,後量子密碼學的遷移將是以太坊面臨的重要挑戰。隨著量子計算的發展,基於 ECDLP 的密碼系統需要逐步過渡到量子抵抗方案。以太坊社區正在積極研究基於格密碼學(CRYSTALS-Dilithium)和哈希簽名(SPHINCS+)的後量子遷移方案,確保以太坊在量子時代的安全性。

參考文獻

  1. Koblitz, N. (1987). Elliptic Curve Cryptosystems.
  2. Miller, V. (1985). Use of Elliptic Curves in Cryptography.
  3. SECG (2000). SEC 2: Recommended Elliptic Curve Domain Parameters.
  4. NIST (2013). Digital Signature Standard (DSS).
  5. Boneh, D., Lynn, B., & Shacham, H. (2004). Short Signatures from the Weil Pairing.
  6. Groth, J. (2016). On the Size of Pairing-based Non-interactive Arguments.
  7. Gennaro, R., Gentry, C., Parno, B., & Raykova, M. (2013). Quadratic Span Programs and Succinct NIZKs without PCPs.
  8. Ethereum Foundation. (2026). EVM OPCODES and Cryptographic Primitives.
  9. Buterin, V. (2017). STARKs, Part I: Proofs with Polynomials.
  10. Pedersen, T. (1991). Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing.

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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