跳轉到

2002 - Rivest、Shamir、Adleman 的 RSA(公開金鑰密碼學)#

案件摘要#

1977 年,Ron Rivest、Adi Shamir、Leonard Adleman(MIT) 發明了 RSA 密碼系統(論文 1978 年發表;2002 年獲圖靈獎):

\[ \boxed{\text{加密的鑰匙(公開)} \ne \text{解密的鑰匙(私密)}} \]

RSA 的數學:

\[ \text{加密}: c = m^e \bmod N \qquad \text{解密}: m = c^d \bmod N \]

其中 \(N = pq\) (兩個大質數)、 \(ed \equiv 1 \pmod{\varphi(N)}\) 。 破解 RSA 的難度 = 質因數分解的難度—— 沒有多項式演算法(經典電腦)!

\[ \text{對稱密碼(同一把鑰匙)} \xrightarrow{\text{RSA 1977}} \text{公開金鑰(兩把鑰匙)}. \]

你的每一次 HTTPS 連線、每一次網路付款,都是 RSA 的後代。

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

  • 金鑰分發的難題(1970s): 對稱密碼(如 DES)的問題:加密與解密用同一把鑰匙——
\[ \text{怎麼把鑰匙安全地送給對方?} \]
  • 快遞(不安全)、電話(可被竊聽)——「鑰匙分發問題」;
  • 軍方用專用線路——民用無解。
  • Diffie–Hellman 的突破(1976): Whitfield Diffie 與 Martin Hellman(2015 圖靈獎)發表 New Directions in Cryptography:
\[ \boxed{\text{公開金鑰的概念(1976)} + \text{金鑰交換協定(DH)}} \]
  • 概念:加密與解密用不同的鑰匙;
  • DH 協定:兩方公開交換訊息,各自算出同一把共享鑰匙:
\[ s = g^{ab} \bmod p \quad\text{(Alice 算 } (g^b)^a\text{,Bob 算 } (g^a)^b\text{)}. \]

但 DH 只是「金鑰交換」——不是完整的加密系統。 - RSA 的誕生(1977): Rivest、Shamir、Adleman(MIT 的三位研究者)讀到 Diffie–Hellman 的論文, 花了一年嘗試各種數學結構—— 1977 年 4 月的某夜,Rivest 突然想到:用「質因數分解」!

\[ \text{加密容易(乘法)} + \text{破解難(分解)} = \text{單向函數的陷阱}. \]
  • GCHQ 的先驅(1973,被保密 24 年): Clifford Cocks(英國政府通訊總部 GCHQ)1973 年就發明了同樣的系統—— 但被列為機密(1997 年才解密公開)!
\[ \text{Cocks(1973,保密)} \xrightarrow{\text{RSA(1977,公開)}} \text{公開者的榮譽}. \]

(與 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\) 。

加密與解密:

\[ c = m^e \bmod N, \qquad m = c^d \bmod N. \]

為什麼有效(歐拉定理,1763):

\[ m^{ed} = m^{1 + k\varphi(N)} \equiv m \cdot (m^{\varphi(N)})^k \equiv m \pmod N \]

(當 \(\gcd(m, N) = 1\) 時, \(m^{\varphi(N)} \equiv 1 \pmod N\) )。

\[ \boxed{\text{RSA 的正確性 = 歐拉定理(200 年前的數學)}} \]

第二條線索:安全性 = 質因數分解#

破解 RSA 的難度:

\[ \text{已知 } (N, e) \text{ 求 } d \Longleftrightarrow \text{分解 } N = pq. \]

質因數分解的演算法: | 演算法 | 複雜度 | 年份 | |--------|--------|------| | 試除法 | \(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 論文):

\[ \boxed{\text{用私密鑰匙「簽名」,用公開鑰匙「驗證"}} \]
\[ \text{簽名}: s = m^d \bmod N \qquad \text{驗證}: m = s^e \bmod N. \]

性質:不可偽造 + 不可否認——身分驗證的數學基礎。 後代:電子簽章、區塊鏈(比特幣的 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):
\[ \boxed{\text{公開金鑰 = 「不需要事先共享秘密」的通訊}} \]
  • 鑰匙分發問題解決——任何人可以和任何人安全通訊;
  • 電子商務的前提——沒有 RSA,就沒有網路購物、網路銀行。
\[ \text{對稱密碼(軍用)} \xrightarrow{\text{DH(1976)+ RSA(1977)}} \text{公開金鑰(民用)} \xrightarrow{} \text{電子商務(1990s)}. \]
  • HTTPS 與網路的安全(1995–):
\[ \text{SSL(1995)} \to \text{TLS(1999)} \to \text{HTTPS(2010s)} \to \text{全網加密(2018+)}. \]

你的每一次綠色鎖頭(HTTPS)都是 RSA/DH 的後代—— - 金鑰交換:DH 或 ECDH(橢圓曲線版); - 數位簽章:RSA 或 ECDSA; - 對稱加密:AES(2012 圖靈獎得主的影響)。

\[ \text{RSA(1977)} \xrightarrow{} \text{SSL/TLS(1995)} \xrightarrow{} \text{HTTPS 世代}. \]
  • 數位簽章與區塊鏈(2008):
\[ \text{RSA 的簽章(1978)} \xrightarrow{\text{ECDSA(1985)}} \text{比特幣(2008)} \xrightarrow{} \text{區塊鏈世代}. \]

比特幣的交易簽名(ECDSA,橢圓曲線)—— 「不可偽造 + 不可否認」的數學(RSA 論文的思想)。 - Shor 的威脅與後量子密碼學(1994–):

\[ \boxed{\text{量子電腦 + Shor 演算法 = RSA 的死刑判決}} \]
  • Shor(1994):量子因數分解是多項式時間—— RSA 在量子電腦上不堪一擊;
  • NIST 的後量子標準(2022–2024): CRYSTALS-Kyber(金鑰交換)、CRYSTALS-Dilithium(簽章)—— 基於格子(lattice)問題(未被量子破解);
  • 2020s 的「先存後解」威脅:現在攔截的密文, 未來量子電腦可解——政府與企業已開始遷移。
\[ \text{RSA(1977)} \xrightarrow{\text{Shor(1994)}} \text{威脅} \xrightarrow{\text{NIST(2024)}} \text{後量子密碼學}. \]
  • 2002 年圖靈獎: Rivest、Shamir、Adleman 三人共同獲得—— 表彰「公開金鑰密碼學」。
  • Rivest 後來發明了 RC4(1987)與 MD5(1991)(後者已被破解——教訓);
  • Adleman 發明了 DNA 計算(1994)——用 DNA 分子計算;
  • Shamir 發明了 Shamir 秘密分享(1979)—— 「秘密分成 n 份,k 份可還原」(門檻密碼學)。
  • GCHQ 的正名(1997):
\[ \text{Cocks(1973,機密)} \xrightarrow{24 \text{ 年}} \text{1997 解密公開} \]

英國政府承認 GCHQ 先於 RSA 發明—— 但公開者(RSA)獲得了榮譽與商業—— 「發明 vs 公開」的悖論(與 Bellman–Ford、Kalman 濾波相似)。 - 數學的勝利(1977):

\[ \boxed{\text{RSA 的正確性 = 歐拉定理(1763)}} \]

200 年前的純數學,成為數位世界的安全基礎—— 「數學是最耐久的投資」—— Gauss 的名言:「數學是科學的女王」——密碼學是她的皇冠。 - 歷史定位:RSA 三人是「數位安全的建築師」——

\[ \text{Diffie–Hellman(1976):概念} \xrightarrow{\text{RSA(1977):實現}} \text{HTTPS(1995)} \xrightarrow{} \text{電子商務 + 區塊鏈 + 後量子遷移}. \]

一句話:你的每一次網路付款,都建立在「質因數分解很難」這個數學事實上。

關鍵人物與文獻#

  • 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。