跳轉到

2005 - 橢圓曲線密碼學#

案件摘要#

1985 年 Neal Koblitz 與 Victor Miller 各自獨立提出:用橢圓曲線上的點加法取代模乘法的冪運算,同樣的單向性難題,但同等安全性只需 1/6 的金鑰長度——160 位元 ECC ≈ 1024 位元 RSA。2005 年起 ECC 進入 TLS 與行動裝置的標準,今天 iPhone、Android 的 TLS 憑證多為 ECDSA/ECDH,而美國 NSA 與各國情報機構早已全面轉向 ECC。ECC 是同樣數學、更小金鑰的典範。

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

RSA 的金鑰長度軍備競賽(見 1977-RSA.md):512(1990s)→ 1024 → 2048 → 4096 位元。原因是分解的算法(數域篩)在改進,RSA 需要不斷加長金鑰才能維持安全。

1970 年代的數學線索:1977 年 Neal Koblitz 在《美國數學月刊》發表〈 elliptic curve cryptosystems〉——同一篇論文裡包含 ECC 與 RSA(1985 Miller 獨立提出,用了 2 年先驅工作):在橢圓曲線群上做同樣的運算。

Koblitz 的洞見:橢圓曲線的離散對數問題沒有像 RSA 那樣的「亞指數」算法——橢圓曲線沒有類比數域篩的結構,最好的攻擊是 Pollard rho( \(O(\sqrt{n})\) ), \(n\) 位元金鑰給 \(2^{n/2}\) 級安全。160 位元 ECC ≈ RSA-1024、256 位元 ECC ≈ RSA-3072。

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

橢圓曲線上的群運算#

短韋斯特拉斯形式(Weierstrass form):

\[ E: y^2 = x^3 + ax + b \quad \text{(在有限域 } GF(p)\text{ 或 } GF(2^n)\text{ 上)} \]

點 \((x, y)\) 加法(弦線法):兩點 \(P, Q\) 的連線交曲線於第三點 \(R\) ,則 \(P + Q = -R\) (對徑點反射)。加上無窮遠點 \(O\) (零元素)——構成阿貝爾群。

倍點(scalar multiplication): \(kP = P + P + \dots\) ( \(k\) 次)——容易(平方乘法, \(O(\log k)\) )。

離散對數:給定 \(P, Q = kP\) ,求 \(k\) ——難(Pollard rho 需 \(O(\sqrt{k})\) 次群運算)。

ECC 的的安全性基礎:橢圓離散對數問題(ECDLP)被認為無多項式或亞指數算法(但未被證明——與 RSA 的分解問題同樣的處境:不是定理,是共識)。

點的表示與壓縮(smart attack 的教訓)#

難點:橢圓曲線點 \((x, y)\) 是 2 個 \(n\) 位元數, \(x\) 已知可算 \(y\) ——故用 \(x\) 座標表示「點的數量」看似減半,但丢了 \(y\) 資訊。

錯誤做法:只用 \(x\) 座標——Smart 攻擊(1999, 1997):橢圓曲線上的配對 \(E \times E \to E\) 是雙線性映射, \(x(x(P) + x(Q))\) 可由 \(x\) 算出——雙線性配對攻擊使 \(x\) 座標表示的可見性被用來攻擊。

正確:壓縮表示 \(x\) + \(y\) 的最低有效位(1 位元標記)——保持雙線性非退化性。

偵探筆記:Smart 攻擊是密碼學史的經典教訓——看似安全的優化(省金鑰)破壞了代數結構,用雙線性配對把資訊「用回來」。這與 Enigma 的反射器(見 1918-Enigma機.md)、RSA 去掉雜湊的教科書簽章(見 1977-RSA.md)同源:「省」的決策常毀滅安全性。

ECC 的金鑰效率#

相同安全強度:

安全位元 RSA 金鑰 ECC 金鑰 比率
80 1024 161 6.4×
112 2048 224 9.1×
128 3072 256 12×
192 7680 384 20×

手機時代的決定性因素:行動裝置的 CPU 與頻寬有限——256 位元 ECC 的簽章比 3072 位元 RSA 快、憑證小 12 倍——ECC 成為 TLS 的首選(2015 年起 iOS 憑證全部 ECC)。

程式碼:橢圓曲線加法與 ECDH#

# 短韋斯特拉斯曲線 y^2 = x^3 + ax + b (mod p)
P = 2**256 - 2**32 - 977
A, B = -3, 0x1F3D              # NIST 曲線參數(概念示範)

def inv(x, p): return pow(x, p - 2, p)   # Fermat 定理:x^{p-2} = x^{-1}

def point_add(P1, P2):
    """橢圓曲線點加法:弦線法"""
    if P1 is None: return P2
    if P2 is None: return P1
    (x1, y1), (x2, y2) = P1, P2
    if x1 == x2 and (y1 + y2) % P == 0:
        return None                             # P + (-P) = O
    if P1 == P2:
        lam = (3 * x1 * x1 + A) * inv(2 * y1, P) % P   # 倍點
    else:
        lam = (y2 - y1) * inv(x2 - x1, P) % P          # 弦線斜率
    x3 = (lam * lam - x1 - x2) % P
    y3 = (lam * (x1 - x3) - y1) % P
    return (x3, y3)

def point_mul(k, P0, p=P):
    """平方乘法:k*P0,O(log k) 次群運算"""
    R = None
    while k:
        if k & 1: R = point_add(R, P0)
        P0 = point_add(P0, P0)                   # 倍點
        k >>= 1
    return R

# ECDH:金鑰交換
G = (0x79BE667E, 0x483ADA77)                   # 基點(概念示範:截斷的 secp256k1 生成元)
a_priv = 987654321; b_priv = 123456789
A_pub, B_pub = point_mul(a_priv, G), point_mul(b_priv, G)
s_A = point_mul(a_priv, B_pub)                 # = a*b*G
s_B = point_mul(b_priv, A_pub)                 # = a*b*G
print(f"ECDH 共享秘密一致:{s_A == s_B}")        # True
print("ECC:256 位元金鑰 ≈ RSA-3072,但快 12 倍、憑證小 12 倍")

標準與現況#

  • secp256r1(NIST P-256):主流 TLS 曲線
  • Curve25519 / Ed25519(Bernstein):更快、更安全的形式化證明(EdDSA 簽章)——WireGuard、Signal _protocol 的首選
  • ECC 的隱憂:NIST 的 P-192/P-224 有「隱藏通道」疑慮(後設機構/backdoor 爭議);Curve25519 因構造簡潔無此爭議——閉源曲線 vs 透明曲線的信任問題
  • 量子:Shor 演算法同樣破 ECC(ECDLP 是離散對數)——同樣需要後量子替代(見 2017-後量子密碼學.md)

結案 -- 後果與影響#

  • 行動裝置的密碼學:ECC 是智慧手機時代的預設——小金鑰是行動裝置的必需品。
  • TLS 的首選:2015 年起 iOS 憑證全部 ECC,ECDHE + ECDSA 是主流。
  • 區塊鏈的基礎:比特幣/以太坊的簽章是 secp256k1(ECDSA);以太坊的 account abstraction 用更好的簽章——見 2016-區塊鏈密碼學.md。
  • 硬體安全:ECC 的硬體實作更簡單(點運算)——HSM、安全晶片的主流。
  • 安全的同源性:同一數學(離散對數)跨 RSA/DH/ElGamal/ECC 四代體系——離散對數的歷史。

關鍵人物與文獻#

  • Neal Koblitz(1953–):華盛頓大學;椭圆曲線密码系统 (1987, American Mathematical Monthly)
  • Victor Miller(1952–):IBM;1985 獨立提出
  • Neal Koblitz & Victor Miller:各自獨立,1985/1987
  • Daniel J. Bernstein:Curve25519 / Ed25519 (2005–2008)
  • SEC(SEC 1/2/3):ECC 標準(2009 起)
  • 交叉參照:1985-ElGamal.md、1977-RSA.md、2016-區塊鏈密碼學.md、1994-Shor演算法.md