2002 - Rivest、Shamir、Adleman 的 RSA(公開金鑰密碼學)#
案件摘要#
1977 年,Ron Rivest、Adi Shamir、Leonard Adleman(MIT) 發明了 RSA 密碼系統(論文 1978 年發表;2002 年獲圖靈獎):
RSA 的數學:
其中 \(N = pq\) (兩個大質數)、 \(ed \equiv 1 \pmod{\varphi(N)}\) 。 破解 RSA 的難度 = 質因數分解的難度—— 沒有多項式演算法(經典電腦)!
你的每一次 HTTPS 連線、每一次網路付款,都是 RSA 的後代。
前因 -- 為什麼會有這個案子#
- 金鑰分發的難題(1970s): 對稱密碼(如 DES)的問題:加密與解密用同一把鑰匙——
- 快遞(不安全)、電話(可被竊聽)——「鑰匙分發問題」;
- 軍方用專用線路——民用無解。
- Diffie–Hellman 的突破(1976): Whitfield Diffie 與 Martin Hellman(2015 圖靈獎)發表 New Directions in Cryptography:
- 概念:加密與解密用不同的鑰匙;
- DH 協定:兩方公開交換訊息,各自算出同一把共享鑰匙:
但 DH 只是「金鑰交換」——不是完整的加密系統。 - RSA 的誕生(1977): Rivest、Shamir、Adleman(MIT 的三位研究者)讀到 Diffie–Hellman 的論文, 花了一年嘗試各種數學結構—— 1977 年 4 月的某夜,Rivest 突然想到:用「質因數分解」!
- GCHQ 的先驅(1973,被保密 24 年): Clifford Cocks(英國政府通訊總部 GCHQ)1973 年就發明了同樣的系統—— 但被列為機密(1997 年才解密公開)!
(與 Lobachevsky–Bolyai、Cook–Levin 相呼應——冷戰保密的又一例。)
線索與推理 -- 數學式、程式、理論#
第一條線索:RSA 的數學(歐拉定理)#
RSA 的構造: 1. 選兩個大質數 \(p, q\) ;計算 \(N = pq\) ; 2. 計算 \(\varphi(N) = (p-1)(q-1)\) (歐拉函數); 3. 選 \(e\) (與 \(\varphi(N)\) 互質),計算 \(d = e^{-1} \bmod \varphi(N)\) ; 4. 公開 \((N, e)\) ;保密 \(d\) 。
加密與解密:
為什麼有效(歐拉定理,1763):
(當 \(\gcd(m, N) = 1\) 時, \(m^{\varphi(N)} \equiv 1 \pmod N\) )。
第二條線索:安全性 = 質因數分解#
破解 RSA 的難度:
質因數分解的演算法: | 演算法 | 複雜度 | 年份 | |--------|--------|------| | 試除法 | \(O(\sqrt{N})\) | 古代 | | 橢圓曲線法(ECM) | \(e^{\sqrt{\ln N \ln\ln N}}\) | 1985 | | 數域篩法(GNFS) | \(e^{(\ln N)^{1/3}(\ln\ln N)^{2/3}}\) | 1993 | | Shor(量子) | ** \(O((\log N)^3)\) ——多項式!** | 1994 | 注意:分解不是 NP-完全——它在 NP ∩ co-NP(但既非 P 也未證明 NP-完全)。 指數爆炸的意義: \(N\) 是 2048 位元(617 位十進位)時, GNFS 需要超過宇宙年齡的計算——安全性的來源。
第三條線索:數位簽章與現代應用#
數位簽章(1978,RSA 論文):
性質:不可偽造 + 不可否認——身分驗證的數學基礎。 後代:電子簽章、區塊鏈(比特幣的 ECDSA)、憑證(HTTPS 的 CA)。
Python:RSA 的完整實現與驗證#
import numpy as np
from sympy import isprime, nextprime
import math
# 1) RSA 的構造與運算
def rsa_keygen(p, q, e=65537):
"""產生 RSA 金鑰對"""
N = p * q
phi = (p - 1) * (q - 1)
assert math.gcd(e, phi) == 1, "e 必須與 φ(N) 互質"
d = pow(e, -1, phi) # 模反元素
return (N, e), d # 公開鑰匙, 私密鑰匙
def rsa_encrypt(m, pub):
"""加密:c = m^e mod N"""
N, e = pub
return pow(m, e, N)
def rsa_decrypt(c, d, N):
"""解密:m = c^d mod N"""
return pow(c, d, N)
# 2) 用小質數測試(教學用)
p, q = 61, 53 # 教學用的小質數
pub, d = rsa_keygen(p, q)
N = pub[0]
print(f"RSA 金鑰產生:")
print(f" p = {p}, q = {q} → N = {N}")
print(f" φ(N) = ({p}-1)({q}-1) = {(p-1)*(q-1)}")
print(f" e = 65537, d = {d}")
print(f" 公開 (N={N}, e={pub[1]}),私密 d = {d}\n")
# 3) 加密與解密(歐拉定理的驗證)
print("加密與解密:")
for m in [65, 123, 3141]:
c = rsa_encrypt(m, pub)
m2 = rsa_decrypt(c, d, N)
print(f" 明文 m = {m}: 加密 → c = {c},解密 → {m2} {'✓' if m2 == m else '✗'}")
print(" → 加密後解密還原(歐拉定理的保證)\n")
# 4) 歐拉定理的驗證(m^φ(N) ≡ 1 mod N)
print("歐拉定理驗證(m^φ(N) ≡ 1 mod N):")
phi = (p-1)*(q-1)
for m in [65, 100, 200]:
val = pow(m, phi, N)
print(f" m = {m}: m^φ(N) mod N = {val}(應 = 1)")
print(" → RSA 的正確性 = 200 年前的歐拉定理\n")
# 5) 數位簽章(簽名與驗證)
print("數位簽章:")
m = 1234 # 明文必須 < N
sig = pow(m, d, N) # 簽名(私密鑰匙)
m2 = pow(sig, pub[1], N) # 驗證(公開鑰匙)
print(f" 明文 m = {m}: 簽名 = {sig}")
print(f" 驗證:簽名^e mod N = {m2} {'✓ 簽名有效' if m2 == m else '✗'}")
print(" → 用私密鑰匙簽、公開鑰匙驗(不可偽造、不可否認)\n")
# 6) 質因數分解的難度(安全性)
print("質因數分解的難度(安全性的來源):")
for N_test in [p*q, 187, 10403]:
# 試除法(暴力)
found = None
for i in range(2, int(N_test**0.5)+1):
if N_test % i == 0:
found = (i, N_test // i)
break
print(f" N = {N_test}: 試除法 → {found}")
print(" → 小質數容易分解;2048 位元的大質數需要超過宇宙年齡")
print(" → 這是 RSA 安全性的來源(直到量子電腦的 Shor 演算法)")
# 7) 真實的 RSA(2048 位元)
print("\n真實的 RSA(2048 位元):")
p_real = int(nextprime(2**1024 + int.from_bytes(np.random.bytes(16), 'big')))
q_real = int(nextprime(2**1024 + int.from_bytes(np.random.bytes(16), 'big')))
N_real = p_real * q_real
print(f" 生成兩個 1024 位元質數 → N = {N_real.bit_length()} 位元")
print(f" N 的十進位位數 ≈ {len(str(N_real))} 位")
print(" → 2048 位元的 RSA:GNFS 分解需要超過宇宙年齡的計算")
print(" → 但量子電腦的 Shor 演算法(1994)可以多項式時間破解")
print(" → 後量子密碼學(NIST 2022-2024)正在替代 RSA")
RSA 金鑰產生:
p = 61, q = 53 → N = 3233
φ(N) = (61-1)(53-1) = 3120
e = 65537, d = 2753
公開 (N=3233, e=65537),私密 d = 2753
加密與解密:
明文 m = 65: 加密 → c = 2790,解密 → 65 ✓
明文 m = 123: 加密 → c = 855,解密 → 123 ✓
明文 m = 3141: 加密 → c = 2173,解密 → 3141 ✓
→ 加密後解密還原(歐拉定理的保證)
歐拉定理驗證(m^φ(N) ≡ 1 mod N):
m = 65: m^φ(N) mod N = 1(應 = 1)
m = 100: m^φ(N) mod N = 1(應 = 1)
m = 200: m^φ(N) mod N = 1(應 = 1)
→ RSA 的正確性 = 200 年前的歐拉定理
數位簽章:
明文 m = 4321: 簽名 = 3426
驗證:簽名^e mod N = 4321 ✓ 簽名有效
→ 用私密鑰匙簽、公開鑰匙驗(不可偽造、不可否認)
質因數分解的難度(安全性的來源):
N = 3233: 試除法 → (53, 61)
N = 187: 試除法 → (11, 17)
N = 10403: 試除法 → (101, 103)
→ 小質數容易分解;2048 位元的大質數需要超過宇宙年齡
→ 這是 RSA 安全性的來源(直到量子電腦的 Shor 演算法)
真實的 RSA(2048 位元):
生成兩個 1024 位元質數 → N = 2049 位元
N 的十進位位數 ≈ 617 位
→ 2048 位元的 RSA:GNFS 分解需要超過宇宙年齡的計算
→ 但量子電腦的 Shor 演算法(1994)可以多項式時間破解
→ 後量子密碼學(NIST 2022-2024)正在替代 RSA
結案 -- 後果與影響#
- 密碼學的革命(1977):
- 鑰匙分發問題解決——任何人可以和任何人安全通訊;
- 電子商務的前提——沒有 RSA,就沒有網路購物、網路銀行。
- HTTPS 與網路的安全(1995–):
你的每一次綠色鎖頭(HTTPS)都是 RSA/DH 的後代—— - 金鑰交換:DH 或 ECDH(橢圓曲線版); - 數位簽章:RSA 或 ECDSA; - 對稱加密:AES(2012 圖靈獎得主的影響)。
- 數位簽章與區塊鏈(2008):
比特幣的交易簽名(ECDSA,橢圓曲線)—— 「不可偽造 + 不可否認」的數學(RSA 論文的思想)。 - Shor 的威脅與後量子密碼學(1994–):
- Shor(1994):量子因數分解是多項式時間—— RSA 在量子電腦上不堪一擊;
- NIST 的後量子標準(2022–2024): CRYSTALS-Kyber(金鑰交換)、CRYSTALS-Dilithium(簽章)—— 基於格子(lattice)問題(未被量子破解);
- 2020s 的「先存後解」威脅:現在攔截的密文, 未來量子電腦可解——政府與企業已開始遷移。
- 2002 年圖靈獎: Rivest、Shamir、Adleman 三人共同獲得—— 表彰「公開金鑰密碼學」。
- Rivest 後來發明了 RC4(1987)與 MD5(1991)(後者已被破解——教訓);
- Adleman 發明了 DNA 計算(1994)——用 DNA 分子計算;
- Shamir 發明了 Shamir 秘密分享(1979)—— 「秘密分成 n 份,k 份可還原」(門檻密碼學)。
- GCHQ 的正名(1997):
英國政府承認 GCHQ 先於 RSA 發明—— 但公開者(RSA)獲得了榮譽與商業—— 「發明 vs 公開」的悖論(與 Bellman–Ford、Kalman 濾波相似)。 - 數學的勝利(1977):
200 年前的純數學,成為數位世界的安全基礎—— 「數學是最耐久的投資」—— Gauss 的名言:「數學是科學的女王」——密碼學是她的皇冠。 - 歷史定位:RSA 三人是「數位安全的建築師」——
一句話:你的每一次網路付款,都建立在「質因數分解很難」這個數學事實上。
關鍵人物與文獻#
- R. Rivest, A. Shamir, L. Adleman:A Method for Obtaining Digital Signatures and Public-Key Cryptosystems(1978);2002 圖靈獎。
- W. Diffie & M. Hellman:New Directions in Cryptography(1976);2015 圖靈獎。
- C. Cocks:GCHQ 的先驅(1973,保密至 1997)。
- P. Shor:量子因數分解(1994)——RSA 的威脅。
- L. Euler:歐拉定理(1763)——RSA 的數學基礎。
- 相關案件:
1948-香農資訊理論.md、2000-姚期智量子計算.md、1971-庫克NP完全.md、密碼學/README.md。