跳轉到

1998 - SSL 與網路加密#

案件摘要#

1994–1998 年,Netscape 發明 SSL(Secure Sockets Layer):把 RSA(見 1977-RSA.md)與對稱加密(見 1977-DES.md)組合成「混合加密」的網路協議——公鑰交換對稱金鑰,對稱加密資料。1998 年起的網路瀏覽器普及(Netscape Navigator、IE),2000 年代 HTTPS 全面化,今天網路上 90% 以上的流量被加密。這是密碼學從「軍事與學術」走向「全民基礎設施」的分水嶺——每次網路連線都在跑 Diffie–Hellman。

前因 -- 為什麼會有這個案子#

1990 年代中期的困境:網際網路是明文的——

  • 電子郵件、HTTP、FTP 全部明文傳輸——任何路由器上的竊聽者都能看到
  • 1995 年的電子商務(Amazon 1995、eBay 1995)需要信用卡——明文傳信用卡號 = 自殺

需求:把 RSA 的「金鑰交換 + 簽章」與對稱加密的「快速」組合起來,嵌入 TCP/IP 協議棧。

Taher ElGamal(ElGamal 密碼的發明者,1985,見 1985-ElGamal.md)1995 年加入 Netscape Security,領導 SSL 3.0 的設計——密碼學理論家直接參與工程實現(與 Turing 的炸彈機、Shannon 的戰時工作同源的傳統)。

線索與推理 -- 數學式、程式、理論#

混合加密(Hybrid Encryption)#

RSA 加密資料太慢(KB/s 級),對稱加密太快但需要金鑰交換(GB/s 級)。SSL 的架構:

\[ \text{握手階段:RSA/DH 交換對稱金鑰 } k \to \text{資料階段:AES/DES 加密資料} \]

數學:

  1. 客戶端 C 驗證伺服器 S 的憑證(S 的 RSA 公鑰,由 CA 簽章)
  2. C 生成隨機對稱金鑰 \(k\) ,用 S 的公鑰加密: \(c = E_{P_K^S}(k)\)
  3. S 用私鑰解密得 \(k\) ;之後全部資料用 \(k\) 對稱加密

分工(現代密碼學的標準架構):

原語 角色 速度
RSA/ECC 身份驗證、金鑰交換 慢(只握手一次)
AES/ChaCha20 資料加密 快(全程)
SHA/HMAC 完整性 快

憑證與 CA:信任的鏈條#

新問題:C 怎麼知道 \(P_K^S\) 真的是 S 的公鑰?——中間人攻擊(見 1976-DiffieHellman金鑰交換.md):竊聽者替換公鑰。

解法:公鑰憑證(certificate):

\[ \text{憑證} = \text{S 的身份} + P_K^S + \text{CA 的簽章} \]

信任鏈:C 信任 CA(根憑證預裝在瀏覽器/OS),CA 用私鑰簽章 S 的公鑰——信任的傳遞:

\[ \text{信任 CA} \to \text{驗證 CA 簽章} \to \text{信任 } P_K^S \]

CA 的工業化:Verisign(1995)、Let's Encrypt(2015,免費自動化憑證)——今天 HTTPS 普及的推手。弱點:CA 的單點信任(2011 年 DigiNotar 被入侵偽造憑證)——憑證透明度(certificate transparency, 2013)的動機。

程式碼:HTTPS 握手的概念#

import random, hashlib

def mod_pow(b, e, n):
    result = 1; b %= n
    while e > 0:
        if e & 1: result = result * b % n
        b = b * b % n; e >>= 1
    return result

# 概念:TLS 1.3 的握手(ECDHE + AES)
# 1. 伺服器憑證(CA 簽章的 RSA/ECDSA 公鑰)——驗證身份
# 2. ECDHE 交換對稱金鑰——前向保密
# 3. AES-GCM 加密資料——快速 + 認證

p = 2**61 - 1
server_pub = mod_pow(3, 12345, p)                    # 伺服器 DH 公鑰(概念)
client_priv = random.getrandbits(40)
client_pub = mod_pow(3, client_priv, p)

shared = mod_pow(server_pub, client_priv, p)         # 共享秘密
session_key = hashlib.sha256(str(shared).encode()).digest()
print(f"會話金鑰 = {session_key[:8].hex()}...(AES 加密資料)")
print("信任鏈:CA 簽章 -> 伺服器公鑰 -> ECDHE -> 會話金鑰 -> AES")

前向保密(Forward Secrecy)#

問題:若伺服器的 RSA 私鑰洩漏,歷史錄下的所有密文都能被解(先存後解)。

解法:前向保密(FS)——每次會話用暫態 DH(ECDHE):

\[ \text{每次會話新選 DH 私鑰,會話結束即丟棄} \]
\[ \text{私鑰洩漏} \nRightarrow \text{歷史會話可解(暫態金鑰已刪)} \]

推理:金鑰的生命週期 = 會話的生命週期——洩漏損害的最小化。TLS 1.3(2018)強制要求前向保密——RSA 金鑰交換被廢除。

偵探筆記:SSL 的推理是「混合加密 + 信任鏈」——公鑰解決身份與金鑰交換,對稱解決速度,CA 解決信任傳遞。每個原語各司其職——與 Kerckhoffs 原則(見 1883-Kerckhoffs原則.md)的「分工」思想同源:把複雜性放在該放的地方。

結案 -- 後果與影響#

  • HTTPS 普及:2010 年代 Let's Encrypt + 瀏覽器強制 → 今天 90%+ 流量加密——密碼學成為全民基礎設施。
  • TLS 1.3(2018):簡化握手、強制前向保密、廢除弱演算法(MD5、RC4、DES)——現代加密協議的典範。
  • CA 工業化:Verisign → Let's Encrypt——免費自動化憑證改變了網路安全。
  • 憑證透明度(2013):CA 的單點信任問題——公開日誌監督 CA。
  • 密碼戰爭的結束:2000 年美國密碼出口自由化——SSL 的普及與密碼學自由化互相推動。
  • 「先存後解」的威脅:前向保密的動機——長期安全需要暫態金鑰(與 Shor 演算法的威脅疊加,見 1994-Shor演算法.md)。

關鍵人物與文獻#

  • Taher ElGamal(1955–):Netscape SSL 3.0 領導者(1995)
  • Netscape:SSL 1.0 (1994)、Navigator 瀏覽器
  • IETF:TLS 1.0 (1999)、TLS 1.2 (2008)、TLS 1.3 (2018)
  • DigiNotar:2011 年入侵事件——憑證透明度的動機
  • Let's Encrypt:2015——免費自動化憑證
  • 交叉參照:1977-RSA.md、1977-DES.md、1976-DiffieHellman金鑰交換.md、2017-後量子密碼學.md