比特幣密碼學原論文深度解析:從 RSA 到橢圓曲線密碼學的學術史詩

深入探討比特幣密碼學的三座基石:RSA、Diffie-Hellman、以及橢圓曲線密碼學(ECC)。從密碼學原論文出發,系統性分析 secp256k1 的數學基礎、ECDSA 簽名過程、Schnorr 簽名的理論優勢、HashCash 工作量證明的設計原理,以及後量子時代的威脅與應對策略。包含完整的數學推導、比特幣地址生成流程、以及密碼學安全性假設的系統性分析。

比特幣密碼學原論文深度解析:從 RSA 到橢圓曲線密碼學的學術史詩

老實說,每次看到比特幣白皮書引用密碼學論文,我都有一種感覺——中本聰這傢伙根本就是個「論文收割機」。他把密碼學界幾十年的精華組裝在一起,然後假裝自己只是做了一個「電子現金系統」。但你認真挖下去,會發現比特幣的密碼學血統比大多數人想像的還要深厚。

這篇文章,我要帶你深入探討比特幣密碼學的三座基石:RSA、Diffie-Hellman、以及橢圓曲線密碼學(ECC)。不是那種看一遍就忘的科普,而是真的走進實驗室、翻開數學證明那種程度的深度解析。如果你對密碼學有興趣但覺得論文太硬,這篇算是個入門階梯。

一、RSA:公鑰密碼學的開山之作

1.1 論文背景:密碼學的「地下狀態」

在聊 RSA 之前,你得先知道 1970 年代的密碼學是什麼狀態。說難聽點,就是一片荒漠。密碼學是軍方的禁區,學術界壓根碰不到。民間對密碼學的理解,大概就是「凱撒密碼」——把字母往前移三位的兒童把戲。

轉折點來自一篇後來被雪藏的論文。1976 年,Diffie 和 Hellman 發表了〈New Directions in Cryptography〉,第一次在學術文獻中提出了「公鑰密碼學」的概念。但遺憾的是,他們只提出了概念,沒有找到具體的數學實現。

1977 年,MIT 的三位研究者 Ron Rivest、Adi Shamir 和 Leonard Adleman 終於把這個坑填上了。他們在 Martin Gardner 的《Scientific American》專欄發表了一篇大眾化的介紹文章,題為〈A Method for Obtaining Digital Signatures and Public-Key Cryptosystems〉。這篇論文後來成為密碼學史上被引用次數最多的文獻之一。

1.2 RSA 的數學心臟

RSA 的安全性建立在「質因數分解很難」這個看似簡單的事實上。具體來說:

金鑰生成過程

  1. 隨機選擇兩個大質數 p 和 q。這裡的「大」是有嚴格定義的——2026 年的安全標準是起碼 2048 位元以上,大概是十進位的 600 多位。這個數字有多大?想像一下:地球上的沙灘總共大概有 10^20 粒沙子,而一個 2048 位的數字大約是 10^617——遠比地球上的沙子多得多。
  1. 計算 n = p × q,以及 φ(n) = (p-1)(q-1)。φ 是歐拉函數,幾何意義是小於 n 且與 n 互質的正整數個數。
  1. 選擇一個與 φ(n) 互質的整數 e 作為公鑰指數。實際上 65537(0x10001)是業界標準選擇——它是個質數,而且 2^16+1 的形式讓乘法運算只需要位移一次,效率極高。
  1. 計算私鑰指數 d,使得 e × d ≡ 1 (mod φ(n))。這裡用到的是擴展歐幾里得算法,可以在多項式時間內求出 d。

加密與解密

公鑰 (e, n) 用來加密:c = m^e mod n

私鑰 (d, n) 用來解密:m = c^d mod n

這個數學看起來有點抽象,讓我做個簡化示例。假設 p = 61,q = 53(真實 RSA 不會用這麼小的質數,但原理是一樣的)。

n = 61 × 53 = 3233

φ(n) = (61-1)(53-1) = 60 × 52 = 3120

選擇 e = 17(與 3120 互質)

計算 d = 2753(使得 17 × 2753 ≡ 1 mod 3120)

公鑰是 (17, 3233),私鑰是 (2753, 3233)。

假設要加密訊息 m = 42:

c = 42^17 mod 3233 = 2557

解密:

m = 2557^2753 mod 3233 = 42 ✓

數學上為什麼解密能還原?推導如下:

c^d ≡ (m^e)^d ≡ m^(ed) (mod n)

由於 e × d ≡ 1 (mod φ(n)),所以 ed = 1 + kφ(n)

如果 m 與 n 互質,根據歐拉定理:m^φ(n) ≡ 1 (mod n)

因此 m^(kφ(n)) ≡ 1^k ≡ 1 (mod n)

m^(ed) ≡ m × 1 ≡ m (mod n) ✓

1.3 RSA 簽名的「反向」妙用

比特幣真正利用的是 RSA 的「反過來用」特性:私鑰持有者用私鑰對訊息的哈希值進行冪運算,任何人用對應的公鑰驗證簽名。

具體來說:

這裡有個精妙之處:用哈希函數而不是直接對訊息簽章。為什麼?因為 RSA 的數學運算量隨著輸入大小線性增長,如果直接對大檔案做 RSA 運算,一筆交易可能需要幾秒鐘的計算時間。用哈希值(固定長度,通常是 256 位)代替,既保證了完整性驗證,又大幅提升了效率。

比特幣後來選擇了 ECDSA 和 Schnorr 簽名而不是 RSA,原因是多方面的。首先是密鑰大小:RSA-2048 的公鑰約 256 bytes,ECDSA secp256k1 的公鑰只需要 33 bytes(壓縮格式)。其次是簽名驗證速度:secp256k1 的標量乘法運算比 RSA 的冪模運算快得多,這對比特幣網路每秒數千筆交易的驗證需求至關重要。

二、Diffie-Hellman:金鑰交換的優雅數學

2.1 從「中間人」困境說起

標準的 Diffie-Hellman 協議有個問題:只能做金鑰交換,沒有認證機制。如果 Mallory 在 Alice 和 Bob 之間搞中間人攻擊,他可以建立兩個獨立的 DH 連接,然後在兩人之間轉發訊息,雙方都渾然不知。

這個問題困擾了密碼學界很久。解決方案是結合公鑰密碼學來驗證身份——TLS 協議的發展史就是一個不斷打補丁的過程。比特幣採用的 ECDH(橢圓曲線 Diffie-Hellman)則更優雅:雙方用自己的私鑰對共享點進行簽名,間接地實現了身份認證。

2.2 DH 協議的數學原理

Diffie-Hellman 的核心思想是這樣的:

假設 Alice 和 Bob 要建立共享秘密。他們先公開選定一個大質數 p 和一個原根 g(generative root)。

  1. Alice 選秘密整數 a,計算 A = g^a mod p,傳送 A 給 Bob
  2. Bob 選秘密整數 b,計算 B = g^b mod p,傳送 B 給 Alice
  3. Alice 計算共享密鑰 K = B^a mod p = (g^b)^a mod p = g^(ab) mod p
  4. Bob 計算共享密鑰 K = A^b mod p = (g^a)^b mod p = g^(ab) mod p

竊聽者 Eve 只能看到 g、p、A、B,要從這些資訊推出 a 或 b 就需要解決「離散對數問題」(Discrete Logarithm Problem, DLP)——這在計算上是不可行的。

讓我用一個具體例子(雖然真實世界用的是天文數字):

假設 p = 23,g = 5(原根)

Alice 選 a = 6,計算 A = 5^6 mod 23 = 15625 mod 23 = 8

Bob 選 b = 15,計算 B = 5^15 mod 23 = 30517578125 mod 23 = 19

Alice 計算 K = 19^6 mod 23 = 47045881 mod 23 = 2

Bob 計算 K = 8^15 mod 23 = 35184372088832 mod 23 = 2 ✓

兩人得到了相同的共享秘密 2,但 Eve 從 (5, 23, 8, 19) 推導不出 a=6 或 b=15。

2.3 比特幣如何利用 DH 思想

比特幣的 ECDSA 簽名過程,本質上就是一次 DH 類型的金鑰協商。只不過比特幣「協商」的對象是歷史區塊內容(區塊哈希),而不是臨時的會話密鑰。

比特幣地址的生成流程是 ECDH 和哈希函數的實際應用:

  1. 從密碼學安全的隨機數生成器創建 256 位的私鑰
  2. 計算公鑰 P = k × G(k 是私鑰,G 是 secp256k1 的生成點)
  3. 公鑰有兩種表示:未壓縮格式(65 bytes)和壓縮格式(33 bytes)
  4. 對公鑰做 SHA-256 哈希,然後做 RIPEMD-160 哈希,得到 20 bytes 的公鑰哈希
  5. 加上版本前綴,做 Base58Check 編碼,得到最終的比特幣地址
原始資料 = 版本前綴(1 byte)+ PubkeyHash(20 bytes)+ 校驗和(4 bytes)
校驗和 = SHA-256(SHA-256(原始資料)) 的前 4 bytes
地址 = Base58Check(原始資料)

這個設計的精妙之處在於:要證明你控制一個地址,你只需要用私鑰對交易做 ECDSA 簽名。驗證者用地址反推出公鑰哈希,再用公鑰驗證簽名。整個過程不需要傳輸私鑰,也不需要第三方信任機構。

三、橢圓曲線密碼學:比特幣的心臟

3.1 從代數幾何到密碼學

橢圓曲線密碼學(Elliptic Curve Cryptography, ECC)的數學基礎比 RSA 複雜得多,但它的效率優勢是壓倒性的。在相同安全強度下,ECC 的密鑰比 RSA 短得多——這對於區塊空間昂貴的比特幣來說,是關鍵的取捨。

比特幣使用的 secp256k1 曲線方程式是:

y² = x³ + 7 (mod p)

其中 p = 2²⁵⁶ - 2³² - 2⁹ - 2⁶ - 2⁴ - 2⁵ - 2⁶ + 1,是一個 256 位的質數。

曲線上的點構成一個阿貝爾群(Abelian Group),群的階是:

n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

這個數字是質數,而且非常大——大概有 78 位數。

群的生成點 G 的座標是:

G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)

3.2 橢圓曲線上的「加法」

在橢圓曲線密碼學中,「加法」的定義和我們平常理解的加法完全不同。假設 P 和 Q 是曲線上的兩個點:

這個定義看起來很奇怪,但它滿足阿貝爾群的所有公理:封閉性、結合律、單位元、逆元、以及交換律。

「標量乘法」k × P 的定義是:對 G 做 k 次加法運算。例如:

3.3 離散對數問題在橢圓曲線上的表現

橢圓曲線離散對數問題(ECDLP)是這樣定義的:已知點 P = k × G,要找出整數 k。

為什麼 ECDLP 在計算上很難?原因和 RSA 的質因數分解問題不同。對於一般的橢圓曲線,目前沒有已知的多項式時間算法可以解決 ECDLP。最好的算法是指數級時間複雜度的 Pollard's rho algorithm,運行時間大約是 O(√n),其中 n 是群的階。

secp256k1 的特殊之處在於它的曲線方程式係數經過特別選擇,使得標量乘法運算可以用射影座標系和額外的優化技巧大幅加速,同時保持密碼學安全性。

3.4 secp256k1 的設計哲學

比特幣選擇 secp256k1 而不是更常見的 NIST P-256 或 secp256r1,有幾個有趣的原因:

可預測性:secp256k1 的參數是「可預測的」——它們是從一個大家都知道的公式算出來的,而不是像 secp256r1(又稱 P-256)那樣由 NIST 隨機選擇的。這引發了一些社群成員對「NSA 後門」的質疑。雖然沒有證據表明 P-256 真的被植入了後門,但比特幣選擇 secp256k1 反映了密碼學社群對「透明性」的執著。

效率:secp256k1 的特殊結構使得標量乘法比 P-256 快約 30%。這個效率優勢在比特幣網路的高頻簽名驗證場景下累積起來,是個不小的數字。

足夠的曲線參數:secp256k1 的階是個質數,這簡化了密碼學證明。群的結構簡單明確,安全性分析也更乾淨。

3.5 ECDSA 簽名:比特幣的心跳

比特幣交易的有效性依賴於 ECDSA 簽名。簽名過程是這樣的:

  1. 從隨機數 k(必須保密且一次性使用)開始
  2. 計算點 (x₁, y₁) = k × G
  3. 計算 r = x₁ mod n(x₁ 是點的 x 座標)
  4. 如果 r = 0,重新選擇 k
  5. 計算 s = k⁻¹ (z + r × dₐ) mod n(z 是交易哈希的前導位,dₐ 是私鑰)
  6. 如果 s = 0,重新選擇 k
  7. 簽名 = (r, s)

驗證過程是:

  1. 計算 w = s⁻¹ mod n
  2. 計算 u₁ = z × w mod n,u₂ = r × w mod n
  3. 計算點 (x₁, y₁) = u₁ × G + u₂ × Q(Q 是公鑰)
  4. 驗證 r ≡ x₁ mod n

為什麼這個數學能驗證簽名?推導如下:

u₁ × G + u₂ × Q = (z × w) × G + (r × w) × (dₐ × G)

= w × (z + r × dₐ) × G

= w × k × s × G(根據 s 的定義)

= k × G(因為 w × s ≡ 1 mod n)

= (x₁, y₁)

所以 r ≡ x₁ mod n 就是驗證成功的條件。

3.6 ECDSA 的脆弱性:Nonce 洩漏

ECDSA 有個危險的實現陷阱:如果同一個私鑰使用了相同的 nonce(k 值)做了兩次簽名,攻擊者可以從兩個簽名中恢復私鑰。

推導很簡單:

s₁ = k⁻¹ (z₁ + r × dₐ) mod n

s₂ = k⁻¹ (z₂ + r × dₐ) mod n

從這兩個方程式中:

k = (z₁ - z₂) × (s₁ - s₂)⁻¹ mod n

dₐ = (s₁ × k - z₁) × r⁻¹ mod n

比特幣歷史上已經發生過多次因 nonce 洩漏導致的比特幣盜竊事件。最著名的是 2010 年 8 月,bitcoin Forum 用戶 "molecular" 開發的 GPU 礦機因為實現 bug,導致某些簽名使用了相同的 nonce,結果被攻擊者從區塊鏈上恢復了私鑰並盜走了幾百個比特幣。

這就是為什麼比特幣社群後來推廣 RFC 6979——一個標準化的確定性 nonce 生成算法,確保同一個私鑰簽名同一個訊息時,k 值是確定的(由私鑰和訊息哈希派生),而不是隨機的。

3.7 Schnorr 簽名:Taproot 升級的心臟

比特幣 2021 年的 Taproot 升級引入了 Schnorr 簽名,取代了原來的 ECDSA。Schnorr 簽名有幾個重要的理論優勢:

線性可聚合性:多個簽名可以「加在一起」,變成一個單一的聚合簽名。這允許 n-of-n 的多簽交易在區塊空間上看起來和普通交易完全一樣——這極大地改善了隱私。

不可延展性:ECDSA 簽名可以被第三方修改(只需要簡單的數學運算),而不影響公鑰驗證。這是比特幣一個長期的安全問題,Schnorr 簽名從數學上杜絕了這個可能性。

安全性證明:Schnorr 簽名有嚴格的數學安全性證明,而 ECDSA 的安全性是「經驗性」的——它安全是因為這麼多年沒被破解,但不意味著它有數學證據。

Schnorr 簽名的數學過程是這樣的:

選擇隨機數 r,計算 R = r × G

計算 e = Hash(R ‖ m)(m 是訊息)

計算 s = r + e × dₐ mod n(dₐ 是私鑰)

簽名 = (R, s)

驗證:

s × G = r × G + e × dₐ × G = R + e × Q(Q 是公鑰)

檢查 Hash(R ‖ m) ≡ e

這個數學的妙處在於:如果有多個人要簽名,可以把 R 值簡單地相加——最終的聚合簽名驗證時,相當於所有原始簽名都驗證過了。

四、HashCash:工作量證明的祖先

4.1 Adam Back 的創見

如果說 RSA 和 DH 解決的是「加密」問題,那 HashCash 解決的是「spam」問題。1997 年,密碼學家 Adam Back(當時還是英國 University of Bristol 的博士後,Cypherpunk 郵件列表的活躍成員)發表了 HashCash。

想法很直白:讓每次發送 email 的計算成本增加到不可忽視的程度。對普通用戶來說偶爾發幾封 email 無所謂,但對 spammer 來說每天發送上百萬封,這個成本就變得無法承受了。

HashCash 的核心是「工作量證明」(Proof-of-Work)。系統要求發送者在 email 的 header 中附上一個 token,這個 token 的產生需要消耗大量的哈希計算。

4.2 HashCash 的技術規格

HashCash token 的格式是:

X-HashCash: 1:20:0307080101182a@ebay.com::Md5OfRandomString:zzzzzzzzzzzzzzzz

格式解析:

生成 token 的方法是:不斷更換隨機字串和碰撞值,直到 SHA-1(版本:位元:挑戰:碰撞值) 的輸出以指定數量的前導 0 位元開頭。

平均來說,如果要求前 n 個位元都是 0,需要嘗試大約 2^n 個不同的輸入。20 位元的位元長度需要平均 2^20 ≈ 100 萬次 SHA-1 運算——1997 年的電腦上大概需要幾秒鐘。

4.3 比特幣對 HashCash 的改進

比特幣的工作量證明幾乎就是 HashCash 的翻版,只不過用 SHA-256 替換了 SHA-1,用區塊內容替換了 email header。

比特幣的 PoW 條件是:SHA-256(SHA-256(區塊頭)) < target

區塊頭包含前一區塊的哈希、工作量證明數(nonce)、Merkle 根、以及時間戳等欄位。礦工不斷改變 nonce,計算區塊頭的雙重 SHA-256,直到結果小於 target。

比特幣的設計有幾個 HashCash 沒有的重要特性:

區塊獎勵:比特幣礦工不只獲得「解決 spam」的成就感,還獲得比特幣作為獎勵。這個激勵機制將 HashCash 從一個防�性工具變成了一個主動建立網路的引擎。

區塊鏈結構:HashCash 的 token 只能使用一次(每個 email 地址加時間戳的組合只能對應一個有效碰撞)。比特幣則把 HashCash 和工作量證明結合起來,形成了一個「歷史記錄」——攻擊者要偽造交易,不僅需要重新計算自己的工作量證明,還需要追上並超越正當區塊鏈的長度。

動態難度調整:比特幣網路每 2016 個區塊調整一次難度目標,確保平均出塊時間保持在 10 分鐘左右。這個設計讓比特幣的工作量證明系統能夠適應算力的變化,保持網路的安全性。

五、密碼學原論文的比特幣拼圖

5.1 三套機制的功能分工

把這三套機制放到一起看,邏輯就清晰了:

RSA/ECDSA 提供了「身份」:透過私鑰、公鑰、地址的密碼學關聯,定義了「誰」控制哪些比特幣。這是所有權的數位化表達。

Diffie-Hellman 提供了「密鑰協商」:比特幣的 ECDSA 簽名過程本質上就是一次 DH 類型的協商,只不過「協商」的對象是歷史區塊內容。

HashCash 提供了「時間戳」和「排序」:工作量證明決定了交易的先後順序,防止了雙花問題。沒有工作量證明,攻擊者可以無成本地發布衝突的交易,網路無法達成共識。

比特幣的設計天才之處不在於發明了任何一個新的密碼學原語,而在於找到了讓這三套機制協同工作的方法。用密碼學身份定義所有權,用工作量證明定義時間順序,用區塊鏈結構定義共識。

5.2 比特幣安全性依賴的密碼學假設

比特幣的安全性建立在哪些密碼學假設之上?

SHA-256 的抗碰撞性:比特幣區塊鏈的 Merkle 樹結構依賴於這個性質。如果兩個不同的交易集合有相同的 Merkle 根,就會產生區塊數據無法檢測的衝突。比特幣用雙重 SHA-256 提供了額外保護。

RIPEMD-160 的抗碰撞性:公鑰哈希使用 RIPEMD-160,如果被破解,攻擊者可能構造出與原公鑰有相同哈希的碰撞公鑰。比特幣社群已在討論遷移到 SHA-256 作為地址的第二層哈希。

secp256k1 離散對數問題的困難性:這是比特幣安全的核心。目前沒有已知算法可以在多項式時間內解決這個問題(經典計算機)。

ECDSA/Schnorr 簽名的不可偽造性:比特幣交易的有效性依賴於簽名的安全證明。Taproot 升級遷移到 Schnorr 簽名正是這個方向的演進。

5.3 後量子時代的威脅

Shor's algorithm 的陰影籠罩著所有基於 RSA 或 ECDLP 的密碼系統。量子計算機用 Shor's algorithm 可以在多項式時間內解決質因數分解和離散對數問題,這意味著 RSA 和 ECDSA 在量子計算機面前都是透明的。

這個威脅有多真實?物理學家和計算機科學家的主流估算認為,能夠威脅 RSA-2048 的量子計算機可能需要數百萬個「邏輯量子位元」,而目前的量子計算機只有數百個「物理量子位元」,而且雜訊極高。

比特幣社群已經在準備應對方案。BIP-360 定義了後量子簽名方案(SLH-DSA/Dilithium)的整合框架。比特幣的設計預留了腳本升級的空間(Tapscript 的 OP_SUCCESS 操作碼),這使得未來引入新的簽名方案而不破壞兼容性成為可能。

有一個問題是比特幣社群內部仍在爭論的:2009 年到 2012 年間挖出的比特幣(俗稱「中本聰時代」的比特幣)大量存放在未使用過的公鑰中。如果量子計算機成熟,這些比特幣將面臨最大的風險——因為一旦攻擊者知道公鑰,就可以推導出私鑰。

六、結語:密碼學是比特幣的靈魂

回顧這三套密碼學機制,RSA、Diffie-Hellman、HashCash——它們各自解決了一個看起來很狹隘的密碼學問題:質因數分解的困難性、離散對數的困難性、哈希碰撞的困難性。但正是這些看起來「消極的」(只能保證某些事情很難做到)數學事實,卻成為建構比特幣的「積極的」(允許建立信任機制)基礎。

比特幣的密碼學設計體現了一種深刻的美學:盡可能少地信任對方,盡可能多地讓子彈(數學)說話。私鑰、公鑰、哈希、工作量證明——這些密碼學工具構成了比特幣的底層語言,而這個語言的詞彙表,其實早在比特幣誕生之前就已經被密碼學家們發明了。

所以下次再有人把比特幣說成「只是一串數字」的時候,你可以在心裡微微一笑:這串數字的背後,是半個世紀的密碼學探索,是無數天才頭腦的智慧結晶,是 RSA、Diffie-Hellman、HashCash 這些論文構築的數學堡壘。比特幣不只是技術創新,它是一座密碼學的紀念碑。


延伸閱讀

標籤:比特幣、密碼學、RSA、Diffie-Hellman、HashCash、橢圓曲線密碼學、ECC、ECDSA、Schnorr 簽名、secp256k1、密碼學原論文、密碼學歷史、公鑰密碼學、工作量證明、雙花問題、量子計算、後量子密碼學

難度等級:高級

預估閱讀時間:55 分鐘

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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