比特幣密碼學基礎
深入理解比特幣核心密碼學技術: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 被用於:
- 區塊頭哈希計算(工作量證明)
- 生成比特幣地址
- Merkle 樹構建
- 交易 ID 計算
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 的選擇基於以下考量:
- 效率:該曲線的參數使得橢圓曲線運算更加高效
- 透明度:曲線參數的選擇方式避免了任何可疑的預設值
- 比特幣原創性:中本聰選擇了 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,某些攻擊會變得更容易。
橢圓曲線運算基礎
在橢圓曲線上,點的加法運算是定義曲線上兩點相加得到第三點的幾何運算:
- 點加法:曲線上兩點 P 和 Q 的和 R = P + Q
- 點倍增:P + P = 2P
- 無限遠點:作為加法的單位元素,類似於傳統加法中的 0
[點加法幾何意義]
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 難以破解:
- 沒有已知的多項式時間算法:傳統計算機上解決 ECDLP 沒有類似 Shor 算法的捷徑
- 指數級複雜度:最佳已知攻擊需要 O(√n) 次曲線運算,對 secp256k1 約為 2^128 次
- 群結構複雜:不同於整數離散對數,橢圓曲線的代數結構更複雜
安全性證明:生日攻擊的下界
對於 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-bit | 1024 bits | 160 bits | 約 1 年 |
| 128-bit | 3072 bits | 256 bits | 約 10^13 年 |
| 256-bit | 15360 bits | 512 bits | 約 10^38 年 |
比特幣使用的 256-bit ECC 提供約 128-bit 安全等級,遠超當前任何可預見的計算能力。
側信道攻擊與防護
純粹的 ECDLP 演算法雖然理論上安全,但實際實現可能存在側信道泄漏:
- 時間攻擊:不同輸入導致不同運算時間
- 功率分析:運算時的功率消耗洩露金鑰資訊
- 故障注入:故意引入錯誤獲得金鑰資訊
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 的橢圓曲線變體,利用橢圓曲線離散對數問題的安全性。
簽章生成過程:
- 選擇隨機 nonce k(必須完全隨機且不可預測)
- 計算曲線點 (x₁, y₁) = k × G
- 計算 r = x₁ mod n
- 計算 s = k⁻¹ (hash(m) + r × privateKey) mod n
- 簽章為 (r, s) 對
關鍵安全考量:nonce k 的選擇至關重要。如果 k 被重複使用或可預測,攻擊者可以從簽章中推導出私鑰。歷史上多起比特幣盜竊事件都與不當的 nonce 生成有關。
Schnorr 簽章
2021 年 Taproot 升級後,比特幣引入了 Schnorr 簽章作為 ECDSA 的替代方案。Schnorr 簽章相比 ECDSA 具有以下優勢:
- 線性驗證:多個簽章可以聚合為單一簽章,實現簽章聚合
- 更簡單的數學結構:安全性證明更簡潔
- 批量驗證效率:多個簽章可以一次性驗證
Schnorr 簽章的基本結構:
R = k × G
e = Hash(R || Message)
s = k + e × privateKey
簽章 = (R, s)
MuSig2 聚合簽章
MuSig2 是一種 Schnorr 多簽章方案,允許多個參與者共同產生一個聚合公鑰和一個聚合簽章。這對於閃電網路等需要多方參與的應用場景特別有用。
Base58Check 編碼
比特幣地址和私鑰使用 Base58Check 編碼,這是一種專為比特幣設計的編碼方式:
- Base58:不使用數字 0、大寫 O、大寫 I、小寫 l 等容易混淆的字元
- Check:包含錯誤校驗碼(SHA-256 雙重哈希的前 4 位元組)
Base58 字元集:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
常見問題
如果量子計算機能否破解比特幣?
量子電腦對比特幣的威脅主要體現在兩個方面:
- Shor 算法:可以在多項式時間內從公鑰推導出私鑰
- Grover 算法:可以加速哈希碰撞搜索
應對措施包括:
- 遷移到後量子密碼學算法(如 lattice-based 簽章)
- 每筆交易使用新地址(避免公鑰暴露在區塊鏈上)
- 量子抗性簽章方案(如 SPHINCS+)
為什麼比特幣選擇 secp256k1 而非 NIST 推薦的曲線?
secp256k1 的選擇有以下原因:
- 曲線參數簡單,減少了「可疑參數」的可能性
- 在相同安全等級下,運算效率更高
- 避免了 NIST 曲線可能存在後門的爭議
私鑰真的無法被暴力破解嗎?
私鑰的空間為 2^256,遠大於可觀測宇宙中的原子數量(約 2^250)。即使使用地球上所有計算資源,也需要數百萬年才能暴力破解一個私鑰。這種安全性基於離散對數問題的計算難度。
參考來源
比特幣白皮書與技術文件
密碼學標準
- FIPS 180-4: Secure Hash Standard
- ANSI X9.62: ECDSA 標準
- RFC 6979: Deterministic ECDSA
學術論文
- Certicom Research, "Standards for Efficient Cryptography - SEC 2: Recommended Elliptic Curve Domain Parameters"
- Peter Shor, "Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer"
開源實現
更新日期:2026-02-23
版本:1.0
本文為比特幣密碼學基礎系列文章之一,建議後續閱讀「比特幣共識機制」與「比特幣腳本語言」。
相關文章
- Taproot 全面解析 — 比特幣最新的腳本升級:MAST、BIP-340/341/342。
- 比特幣腳本語言入門 — 理解 Bitcoin Script 的基本指令與運作原理。
- Nakamoto 共識機制 — 深入分析比特幣的革命性共識機制:工作量證明、最長鏈原則、激勵相容性與安全性分析。
- Bitcoin Core 節點運作 — 運行完整節點,理解比特幣網路的運作機制。
- UTXO 模型詳解 — 比特幣的未花費交易輸出模型與帳戶模型比較。
延伸閱讀與來源
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!