以太坊密碼學歷史與技術脈絡:從密碼學理論到區塊鏈實踐

深入探討以太坊所採用的密碼學技術背後的歷史脈絡與決策邏輯,特別聚焦於 secp256k1 橢圓曲線的選擇爭議、Keccak 與 SHA-3 標準化的歷史淵源,以及這些技術決策對以太坊安全模型與未來發展的深遠影響。

以太坊密碼學歷史與技術脈絡:從密碼學理論到區塊鏈實踐

概述

密碼學是區塊鏈技術的根基,而以太坊的密碼學選擇更是一部跨越數十年的密碼學發展史。本文深入探討以太坊所採用的密碼學技術背後的歷史脈絡與決策邏輯,特別聚焦於 secp256k1 橢圓曲線的選擇爭議、Keccak 與 SHA-3 標準化的歷史淵源,以及這些技術決策對以太坊安全模型與未來發展的深遠影響。理解這些歷史背景不僅有助於評估當前系統的安全性,更能幫助我們預見未來密碼學演進的方向,特別是在後量子密碼學日益逼近的當下。

本文將從橢圓曲線密碼學的理論基礎出發,詳細敘述 secp256k1 的設計考量、比特幣與以太坊的技術繼承關係、Keccak 算法從競賽到標準化的完整歷程,以及以太坊在後量子時代可能面對的挑戰與準備工作。透過這種歷史視角,我們可以更深入理解以太坊作為一個去中心化計算平台所做的技術權衡。

一、橢圓曲線密碼學的理論基礎

1.1 從 RSA 到橢圓曲線:密碼學的效率革命

密碼學的歷史在二十世紀經歷了從簡單替換密碼到複雜數學問題的演進。1977 年,Rivest、Shamir 和 Adleman 共同發明了 RSA 加密算法,這是人類歷史上第一個公開實用的公鑰密碼系統。RSA 的安全性基於大整數分解的數學困難性,這個看似簡單的問題在傳統計算機上需要極其龐大的運算資源才能解決。

然而,隨著計算能力的提升,RSA 的密鑰長度需求持續增長。1990 年代,512 位 RSA 被破解,1024 位 RSA 被建議淘汰,2048 位 RSA 成為主流。這種密鑰長度的膨脹帶來了效率問題:更長的密鑰意味著更慢的運算速度、更大的存儲需求和更高的計算成本。根據摩爾定律,要維持相同的安全性,RSA 密鑰長度需要每兩年增加約 23 位,這種線性增長最終將變得不可持續。

橢圓曲線密碼學(Elliptic Curve Cryptography, ECC)的出現為這個問題提供了優雅的解決方案。ECC 的安全性基於橢圓曲線離散對數問題(Elliptic Curve Discrete Logarithm Problem, ECDLP),這個問題在某些數學結構下比大整數分解更加困難。這意味著 ECC 可以用更短的密鑰提供同等甚至更高的安全性:256 位 ECC 密鑰大致相當於 3072 位 RSA 密鑰的安全性,而運算速度快得多。

密鑰長度效率比較
────────────────────────────────────────────────────────────

安全性等級    │ RSA 密鑰長度  │ ECC 密鑰長度  │ 密鑰比率
──────────────┼───────────────┼───────────────┼──────────
80-bit        │ 1024 bits    │ 160 bits      │ 6.4:1
128-bit       │ 3072 bits    │ 256 bits      │ 12:1
192-bit       │ 7680 bits    │ 384 bits      │ 20:1
256-bit       │ 15360 bits   │ 512 bits      │ 30:1

運算效率比較(相對時間):
────────────────────────────────────────────────────────────
RSA 2048 位密鑰生成: ████████████████████████████ 100ms
ECC 256 位密鑰生成:  ████ 2ms

RSA 2048 位解密:    ██████████████████████████████ 150ms
ECC 256 位解密:     ██████ 8ms

1.2 橢圓曲線的數學原理

橢圓曲線並非橢圓形,而是一類滿足特定代數方程的平面曲線。在密碼學應用中,我們通常使用在有限域上定義的橢圓曲線。比特幣和以太坊採用的 secp256k1 曲線定義為:

y² = x³ + 7 (mod p)

其中 p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
    = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F

這個方程看起來簡單,卻蘊含著深刻的數學意義。曲線上的點(x, y)構成了一個有限阿貝爾群,在這個群上可以定義類似於整數加法的「點加法」運算。這種代數結構使得我們可以在橢圓曲線上構建類似於 RSA 的密碼系統,但效率更高。

橢圓曲線密碼學的安全性核心在於離散對數問題的困難性。給定曲線上的兩個點 P 和 Q = nP,即使知道 P 和 Q,也無法在多項式時間內確定整數 n。這種「單向函數」的特性正是公鑰密碼學的基礎。

橢圓曲線點加法示意
────────────────────────────────────────────────────────────

點 P 和 Q 的加法 P + Q = R:

1. 計算連接 P 和 Q 的直線斜率 λ
   λ = (y₂ - y₁) / (x₂ - x₁) (mod p)

2. 找到直線與曲線的第三個交點 R'

3. R 為 R' 關於 x 軸的對稱點

特殊情況:
- P = Q 時,使用切線而非割線(倍點運算)
- P = -Q 時,結果為無窮遠點(零元素)

點的循環:
G, 2G, 3G, 4G, ..., nG = O(回到無窮遠點)
其中 n 為基點的階(order)

1.3 橢圓曲線參數選擇的藝術

選擇一條安全、高效的橢圓曲線並非易事。密碼學家需要考慮諸多因素:曲線的數學特性、實現的便利性、抵抗已知攻擊的能力,以及避免任何潛在「後門」的可能性。

橢圓曲線的選擇涉及以下關鍵考量:

曲線方程的形式:不同的曲線方程形式適合不同的計算優化。secp256k1 採用的 Weierstrass 方程 y² = x³ + ax + b 是一種通用形式,便於理解和實現。另一種常見的形式是 Montgomery 曲線(如 Curve25519),它允許更高效的點運算,特別適合資源受限的環境。

有限域的選擇:橢圓曲線可以在不同的有限域上定義,最常見的是質數域 Fp(其中 p 為大質數)和二元擴展域 GF(2^m)。質數域的實現通常更簡單,而二元域在硬體實現上有優勢。secp256k1 使用質數域,p = 2^256 - 2^32 - 977 這個質數的選擇經過精心設計,能夠使用定點數算術進行高效計算。

基點的選擇:基點 G 是曲線上的一個特殊點,所有其他點都可以通過重複倍點運算生成。基點的選擇必須確保其階 n 是質數,且 n 與 p-1 互質。secp256k1 的基點階為:

n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141

這個 256 位質數確保了足夠的ecurity margin。

二、secp256k1 的設計考量與歷史淵源

2.1 橢圓曲線標準化的歷史背景

1990 年代後期,美國國家標準與技術研究院(NIST)開始標準化橢圓曲線密碼學。經過多年的公開徵集和密碼分析,NIST 於 2000 年發布了 FIPS 186-2 標準,指定了一系列推薦曲線。

NIST 選擇的曲線分為兩類:所謂的「偽隨機」曲線和「特殊」曲線。偽隨機曲線(如 secp256r1/P-256)的參數透過對特定種子進行哈希生成,這種方法聲稱可以避免參數選擇過程中的任何「後門」。特殊曲線(如 secp256k1)則使用直接指定的參數,更加透明但需要更多的信任。

NIST 標準化橢圓曲線比較
────────────────────────────────────────────────────────────

曲線名稱       │ 方程              │ 密鑰大小  │ 類型
───────────────┼──────────────────┼───────────┼────────────
secp224r1     │ y² = x³ - 3x + b │ 224-bit   │ 偽隨機
secp256r1     │ y² = x³ - 3x + b │ 256-bit   │ 偽隨機
secp384r1     │ y² = x³ - 3x + b │ 384-bit   │ 偽隨機
secp521r1     │ y² = x³ - 3x + b │ 521-bit   │ 偽隨機
secp256k1     │ y² = x³ + 7      │ 256-bit   │ 特殊

secp256r1 (P-256) vs secp256k1 的關鍵差異:
────────────────────────────────────────────────────────────
特性              │ secp256r1 (P-256)   │ secp256k1
─────────────────┼────────────────────┼──────────────
曲線方程          │ y² = x³ - 3x + b    │ y² = x³ + 7
質數 p           │ 2^256 - 2^224 + 2^192 + 2^96 - 1 │ 2^256 - 2^32 - 977
a 係數           │ -3                  │ 0
b 係數           │ 0x5AC635D8AA3A93E7 │ 7
參數來源          │ SHA-1(Seed)         │ 直接指定
優化難度         │ 較難優化            │ 易於優化
主流使用         │ 傳統 web PKI       │ 區塊鏈

2.2 比特幣為何選擇 secp256k1

2008 年,中本聰在比特幣白皮書中選擇了 secp256k1 而非 NIST 推荐的 P-256(secp256r1)。這個決定在比特幣社區內外引發了長期討論,直到今天仍有爭議。

選擇 secp256k1 的可能原因包括:

效率考量:secp256k1 的參數(特別是 p = 2^256 - 2^32 - 977)允許使用定點數算術進行特別高效的模運算。這個質數的獨特之處在於可以使用所謂的「蒙哥馬利階梯」(Montgomery ladder)技術,該技術不僅高效,還能抵抗某些側通道攻擊。

簡潔性:相比 P-256 使用 a = -3,secp256k1 使用 a = 0,這使得曲線方程更簡單。雖然這種簡潔性在理論安全性上的影響微乎其微,但它使得曲線更易於理解和實現。

避免爭議:NIST P-256 等曲線使用「派生」參數,這意味著無法完全確定這些參數是否經過特殊選擇以存在潛在弱點。雖然沒有證據表明 NIST 曲線確實存在後門,但選擇一組透明、自然的參數可以消除這種「懷疑空間」。

比特幣開發時期的可用性:在比特幣設計和開發的 2007-2009 年期間,secp256k1 已經有可用的開源實現。選擇已經過測試的曲線降低了系統開發的風險和複雜度。

secp256k1 vs P-256 效率比較
────────────────────────────────────────────────────────────

運算類型           │ P-256              │ secp256k1
─────────────────┼────────────────────┼──────────────
點加法            │ 100% (基準)        │ 110%
點倍增            │ 100% (基準)        │ 85%
密鑰生成          │ 100% (基準)        │ 80%
簽章驗證          │ 100% (基準)        │ 95%

說明:
- secp256k1 在點倍增和密鑰生成上略有優勢
- 差異來源於曲線方程和質數選擇的不同
- 實際差異可能因實現方式而異

2.3 來自密碼學社群的批評

密碼學社群對 secp256k1 的選擇存在不同觀點。一些知名密碼學家提出了批評:

Daniel Bernstein 的批評:Daniel Bernstein(Curve25519 的設計者)長期批評 NIST 曲線的設計。他指出,無論是 P-256 還是 secp256k1,都缺乏針對現代側通道攻擊的優化。他設計的 Curve25519 採用了所謂的「抵抗側通道」設計原則。

_curve25519 的設計原則

NSA 後門疑雲:2013 年,愛德華·斯諾登披露的文件顯示 NSA 試圖影響密碼學標準的制定。這加劇了密碼學社群對 NIST 標準的質疑,雖然沒有直接證據表明 NIST 曲線存在後門。

技術選擇的權衡:從純技術角度看,Curve25519 + Ed25519(EdDSA 簽章)在許多指標上優於 secp256k1 + ECDSA。然而,這種比較忽略了歷史和實踐因素:ECDSA 是當時的標準,而比特幣需要與現有系統兼容。

2.4 以太坊的技術繼承決策

以太坊在 2014-2015 年設計時,已經有比特幣多年使用 secp256k1 的經驗。選擇同一曲線是一個務實的決定:

安全記錄:到 2014 年為止,secp256k1 已經有五年以上的實際運行歷史,沒有發現重大漏洞。這種「戰鬥測試」對於安全關鍵系統至關重要。

工具生態:圍繞 secp256k1 已經建立了成熟的工具生態。硬體錢包、軟體庫、測試用例都已經過開發和審計。任何新曲線都需要重新構建這一切。

開發者知識:以太坊開發團隊和更廣泛的區塊鏈開發者社區對 secp256k1 有深入了解。這有利於長期維護和審計。

變更成本:更改曲線需要硬分叉,這在政治和技術上都極為困難。以太坊的設計團隊選擇了最小風險路徑。

以太坊 secp256k1 實現的演進
────────────────────────────────────────────────────────────

時期          │ 實現方式           │ 特性
─────────────┼────────────────────┼─────────────────────
2015-2017    │ 客戶端內置         │ 各客戶端獨立實現
2017-2020    │ 密碼學庫標準化     │ 統一使用 crypto 庫
2020-至今    │ 全面審計           │ 形式化驗證 + 獨立審計

安全性提升:
- 2016: 首次第三方安全審計
- 2018: 多個客戶端實現比對測試
- 2020: 形式化驗證項目啟動
- 2022: Certora 智能合約審計
- 2024: Runtime Verification 全面審計

三、Keccak 與 SHA-3 標準化的歷史淵源

3.1 SHA-3 競賽的背景

2004 年至 2005 年,密碼學界接連發現 MD5 和 SHA-1 的嚴重漏洞,這些曾經廣泛使用的雜湊函數被證明存在實際可行的碰撞攻擊。這個發現震動了整個密碼學界,因為 MD5 和 SHA-1 長期以來被認為是安全的,並且廣泛應用於各種安全系統中。

MD5 和 SHA-1 攻擊時間線
────────────────────────────────────────────────────────────

1992: SHA-1 發布(NIST 標準)
1994: MD5 發布(Ronald Rivest 設計)

2004:
  - 8月: 王小雲團隊發布 MD5 碰撞攻擊
  - 9月: SHA-0 碰撞攻擊
  - 11月: 完整 MD5 碰撞攻擊

2005:
  - 2月: SHA-1 理論碰撞攻擊(2^69 操作)
  - 8月: SHA-1 實際碰撞攻擊(2^63 操作)

影響:
- SSL 憑證機構停止使用 MD5
- SHA-1 在大多數應用中被淘汰
- NIST 啟動 SHA-3 競賽

面對這些衝擊,NIST 於 2007 年正式宣布舉辦 SHA-3 雜湊函數競賽。目標是選擇一個新的標準雜湊函數,以增強密碼學工具套件的健壯性。

3.2 Keccak 的設計與獲勝

SHA-3 競賽收到了 64 個提交方案,經過多輪公開評估和密碼分析,最終在 2012 年宣布 Keccak 為獲勝者。

Keccak 由四位歐洲密碼學家設計:

這種「歐洲隊」的勝利意義重大,因為它減少了美國國家安全局(NSA)可能影響標準的擔憂。

SHA-3 競賽評估過程
────────────────────────────────────────────────────────────

階段 1 (2008-2009):
- 64 個初始提交
- 排除不完整的提交
- 51 個候選進入第一輪評估

階段 2 (2009-2010):
- 第一輪評估
- 14 個候選進入第二輪
- 密碼分析顯示多個候選的弱點

階段 3 (2010-2012):
- 第二輪評估
- 5 個決賽候選:BLAKE, Grøstl, JH, Keccak, Skein
- 公開討論和密碼分析

最終評估:
- Keccak 以其簡潔設計、高效實現、靈活參數獲勝
- 2012 年 10 月 NIST 宣布 Keccak 為 SHA-3 標準

Keccak 的創新在於採用了所謂的「海綿結構」(Sponge Construction),這是一種不同於傳統 MD 系列的設計:

海綿結構示意
────────────────────────────────────────────────────────────

輸入 ──▶ 吸收階段 ──▶ 擠壓階段 ──▶ 輸出
         │                    │
         │    狀態矩陣         │
         │  (1600 bits)       │
         │                    │
         └── Keccak-f 置換 ──┘

關鍵參數:
- rate (r): 每次處理的輸入/輸出位元數
- capacity (c): 內部狀態中受保護的位元數
- 輸出安全性 = c/2 bits

Keccak-256 參數:
- r = 1088 bits
- c = 512 bits
- 輸出 = 256 bits
- 安全性 = 256 bits

3.3 以太坊選擇 Keccak 的歷史脈絡

以太坊在設計時(2013-2014 年),SHA-3 標準尚未最終確定。Keccak 作為 SHA-3 競賽的領先候選已經存在,並且通過了初步的密碼分析。

以太坊團隊選擇 Keccak(而非等待 SHA-3 標準)的原因包括:

時機考量:以太坊的開發時間表無法等待 SHA-3 標準化完成。選擇一個已經過審計的算法比等待更確定。

技術偏好:Keccak 的海綿結構提供了獨特的優勢,特別是靈活的輸出長度。這種「現代」設計可能對以太坊團隊有吸引力。

避免 NIST 爭議:NSA 乾預密碼學標準的歷史(特別是 Dual EC DRBG 後門事件)使密碼學社群對 NIST 標準持謹慎態度。選擇一個非 NIST 設計的算法可以避免這種敏感性。

比特幣的對比:比特幣使用 SHA-256 和 RIPEMD-160。以太坊選擇不同的雜湊函數可能是為了避免與比特幣的技術重疊,雖然兩者後來在數百個方面趨同。

以太坊密碼學選擇時間線
────────────────────────────────────────────────────────────

2013:
  - 以太坊黃皮書發布
  - 選擇 Keccak-256 作為主要雜湊函數
  - 選擇 secp256k1 作為橢圓曲線

2014:
  - 以太坊 ICO
  - PoC 客戶端發布
  - 使用 Keccak-256 的地址生成和簽章

2015:
  - 以太坊主網上線
  - 確認使用 Keccak-256

2020s:
  - SHA-3 標準已成熟
  - Keccak-256 仍然保持安全性
  - 社區討論是否遷移到 SHA-3(未實現)

3.4 Keccak 與 SHA-3 的差異

當 NIST 在 2015 年發布 SHA-3 標準時,許多人才驚訝地發現 Keccak 和 SHA-3 並不完全相同。

Keccak vs SHA-3 差異
────────────────────────────────────────────────────────────

差異點              │ Keccak              │ SHA-3
───────────────────┼────────────────────┼────────────────────
Padding            │ 10*1(原始)        │ 10*1(不同規則)
輸出模式            │ 多種模式            │ 固定輸出
霧化倍數           │ 可變                │ 固定為 24
預設輸出           │ Keccak-256         │ SHA3-256
安全參數            │靈活(c = 256-1024)│ 固定

Padding 差異的影響:
────────────────────────────────────────────────────────────

相同輸入: "Hello, World!"
Keccak-256:    0x131...a47
SHA3-256:      0x64f...2b1

兩者輸出完全不同,不可互換使用!

在以太坊生態中:
- keccak256() → Keccak-256(正確)
- sha3() → 通常也是 Keccak-256(但可能造成混淆)
- SHA3.new() → NIST SHA-3(注意!)

這種差異在實踐中造成了混亂。開發者經常混淆 Keccak 和 SHA-3,導致安全漏洞。Solidity 的 keccak256 函數明確執行 Keccak-256,這是正確的,但其他語言和庫的 sha3 函數可能執行不同的算法。

四、以太坊密碼學的未來挑戰

4.1 量子計算威脅

量子計算機的發展對現有密碼學構成潛在威脅。對於區塊鏈系統,這種威脅尤其嚴重:區塊鏈的不可變性意味著今天加密的數據可能在未來被解密。

量子計算對區塊鏈密碼學的威脅
────────────────────────────────────────────────────────────

威脅等級分析:

1. Shor 算法威脅(高風險)
   - 攻擊目標: RSA, ECDSA, ECDH
   - 威脅程度: 破解私鑰
   - 所需量子位: ~4000 邏輯量子位
   - 預計影響時間: 未知(可能 10-20 年)

2. Grover 算法威脅(中風險)
   - 攻擊目標: SHA-256, Keccak-256
   - 威脅程度: 雜湊安全性減半
   - 所需量子位: ~2500 邏輯量子位
   - 緩解: 使用 512-bit 輸出

時間線估計:
────────────────────────────────────────────────────────────
2020s: 量子計算取得階段性進展
      - 數百量子位的機器
      - 錯誤率顯著降低
      
2030s: 可能達到密碼學相關臨界點
      - 數千量子位
      - 容錯量子計算
      
2040s+: 實用威脅可能出現
      - 百萬量子位
      - 橢圓曲線可能被破解

4.2 以太坊的後量子準備

以太坊社區已經開始評估後量子遷移策略:

短期關注

中期準備

長期演進

後量子密碼學候選算法
────────────────────────────────────────────────────────────

基於格的算法(主流候選):
- CRYSTALS-Kyber(密鑰封裝)
- CRYSTALS-Dilithium(數位簽章)
- Falcon(數位簽章)

基於雜湊的算法:
- SPHINCS+(數位簽章)
- XMSS(數位簽章)

基於碼的算法:
- Classic McEliece(密鑰封裝)

以太坊可能的遷移路徑:
1. 混合方案(後量子 + 傳統)
2. 分階段遷移
3. 硬分叉升級

挑戰:
- 密鑰大小增加
- 簽章大小增加
- 計算開銷增加
- 智能合約兼容性

4.3 密碼學演進的歷史教訓

回顧密碼學的歷史,我們可以總結以下教訓:

沒有絕對安全的系統:即使是看似安全的算法也可能被發現新的攻擊。MD5 和 SHA-1 的倒塌是這個教訓的經典例證。

標準化是雙刃劍:標準化促進了互操作性,但也可能導致「把所有雞蛋放在一個籃子裡」的風險。

實用性很重要:最「優雅」的密碼學解決方案不一定是最成功的。比特幣和以太坊選擇 secp256k1 不是因為它是最「完美」的選擇,而是因為它足夠好並且已經過測試。

長期規劃的困難:密碼學系統的設計寿命是數十年,但技術發展速度越來越快。規劃未來需要平衡保守和創新。

結論

以太坊的密碼學選擇反映了密碼學數十年的發展歷程和區塊鏈技術的特殊需求。secp256k1 和 Keccak-256 都不是「最新」或「最時尚」的選擇,但它們是經過時間考驗的可靠選擇。

secp256k1 的選擇體現了比特幣對實用性的強調,選擇了一條有著良好安全記錄、易於實現、並且已經過廣泛審計的曲線。以太坊繼承了這個選擇,進一步鞏固了 secp256k1 在區塊鏈領域的地位。

Keccak 的選擇則反映了在標準化過程中的謹慎態度。選擇一個已經過初步審計的候選算法,而非等待漫長的標準化過程,這種務實的決策使以太坊能夠按時上線。

展望未來,以太坊將面對後量子密碼學的挑戰。這個挑戰不是孤立的,而是整個密碼學社區共同面對的問題。通過持續關注密碼學發展、準備遷移路徑、並保持社區共識,以太坊有望安全地渡過這個轉型期。

密碼學是區塊鏈安全性的根基。理解這些技術背後的歷史脈絡,有助於我們更深入地評估區塊鏈系統的安全性,並為未來的發展做好準備。

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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