跳轉到

2.3 維吉尼亞密碼與 Enigma#

維吉尼亞密碼:多表替代的經典#

維吉尼亞密碼(16 世紀)使用一個關鍵字當金鑰,對明文第 i 個字母用「移位量 = 關鍵字第 i mod L 個字母」加密,等於循環使用 L 張凱薩替代表。它因此被稱為「不可破的密碼」達三百年,直到被 Kasiski/Babbage 破解。

演算法步驟#

  1. 選定關鍵字,如 KEY(L=3)。
  2. 對明文第 i 個字母 p,取 k = K[i mod L] 的字母編號。
  3. 加密:C = (P + k) mod 26;解密:P = (C - k) mod 26。

Python 實作#

def vigenere(text: str, key: str, decrypt: bool = False) -> str:
    key = [ord(c.upper()) - 65 for c in key if c.isalpha()]
    out, i = [], 0
    for ch in text:
        if ch.isalpha():
            base = ord('A') if ch.isupper() else ord('a')
            shift = key[i % len(key)]
            if decrypt:
                shift = -shift
            out.append(chr((ord(ch) - base + shift) % 26 + base))
            i += 1
        else:
            out.append(ch)
    return ''.join(out)

ct = vigenere("ATTACKATDAWN", "LEMON")
print(ct)                              # LXFOPVEFRNHR
print(vigenere(ct, "LEMON", True))     # ATTACKATDAWN

破密:Kasiski 測試與金鑰長度#

  • Kasiski 測試:在密文中尋找重複片段,其間距若為金鑰長度 L 的倍數,則 L 是各間距的最大公因數候選。
  • 索引重合度(IC):把密文切成 L 組(每 L 個字母取一),若 L 正確,每組都是單表替代,其 IC 接近英文的 0.0667;若 L 錯誤則接近隨機的 0.0385。
  • 確定 L 之後:每組各自變成 2.2 節的頻率分析問題,26 次試驗逐組破解。

教訓:維吉尼亞的崩潰不是因為「多表」不好,而是因為金鑰循環使用——金鑰週期 L 就是攻擊的把手。現代串流加密(4.3 節)正是它的後裔:把「循環短金鑰」換成「不重複的偽隨機金鑰流」,金鑰流重複正是現代串流加密最致命的錯誤(nonce 重用)。

Enigma:機械多表密碼的巔峰與崩潰#

Enigma(德國,1930 年代起)把多表替代推到極致:

  • 3 個轉輪(自備 5 個選 3),每鍵一字輪轉一格,像「加密週期長達 26³」的維吉尼亞;
  • 接線板額外交換最多 13 對字母,令金鑰空間暴增;
  • 反射器讓加解密同一程序,但也造成「沒有任何字母能加密成自己」這一致命結構弱點。

Enigma 為何被破解#

  1. 金鑰空間雖大(約 10^23),但每天的金鑰只有幾十位元,且程序規定每則訊息開頭傳送「訊息金鑰」兩次(為防傳輸錯誤),同一組設定加密兩次出現的位置 1 與 4——波蘭數學家 Rejewski 正是利用這個程序漏洞用純數學重建了轉輪接線。
  2. 已知明文充足:每日固定格式的天氣報告(WETTER)與禮貌用語(HEIL HITLER)提供了大量已知明文攻擊素材(1.2 節的模型)。
  3. 「不加密成自己」:Turing 的 Bombe 電路利用這一特性大幅剪枝,機械化窮舉每日金鑰。
  4. 金鑰管理與人為惰性:操作員偏好「女友名字」等可猜測的訊息金鑰。

教訓(對應 1.3 節)#

Enigma 的問題 現代對應
訊息金鑰重複傳兩次 協定設計失誤(如 WEP 的 IV 重用)
依賴操作員自選金鑰 弱金鑰、弱密碼(9.3 節)
結構自帶「不加密成自己」 演算法層面的結構性洩漏

安全性分析與現代意義#

維吉尼亞與 Enigma 共同說明:金鑰流的週期性與可預測性是替代式密碼的阿基里斯腱。現代解法是第 3、4 章的路線——一次性密碼本(真隨機、等長、不重複)或 AES/ChaCha20(金鑰流由偽隨機函數產生、週期天文數字)。當你之後學到 CBC 的 IV 要求、CTR 模式的 nonce 禁止重用時,都會看到維吉尼亞的幽靈。

練習#

  1. 用關鍵字 PYTHON 加密 CRYPTOGRAPHY IS FUN,並寫程式驗證解密正確。
  2. 寫程式實作 IC(索引重合度)函數,對一段維吉尼亞密文掃描 L=1~20,找出最可能的金鑰長度。
  3. 上網查詢 Enigma 反射器的「不加密成自己」特性,思考:這個特性讓 Bombe 能剪掉哪些金鑰假設?用一個簡單例子(3 字母迷你版)說明。