先說清楚:以下方法「不是必要的」(講義 p. 18)

講義 p. 18 開宗明義:要斷定這些歷史密碼不安全,完全不需要暴力搜尋或頻率分析。四個理由,每個都是 Week 2 某個定義的直接應用:

L6.2cmL3.0cmL5.2cm 講義的理由 & 對應的安全概念 & 本教材中的例子
可以挑同長度的 \(m_0,m_1\),從 \(c_b\) 分辨出哪個被加密 & IND-EAV(單次挑戰、無預言機) & Problem 1 (iii):\(\ct{aa}\) vs. \(\ct{ab}\)
一對 \((m,c)\) 就洩漏 \(\sk\) 的資訊 & 已知明文攻擊(KPA) & Caesar:\(\sk=c_1-m_1\)
能存取 \(\Enc(\sk,\cdot)\) 就能直接取回 \(\sk\) & IND-CPA 的預言機 & Problem 1 (ii):查詢
它們都是確定性的 & Week 2 定理 6.1 & 任何重複的明文片段都看得到

反過來說,抵擋這些攻擊只是「最低門檻」:一個方案要有希望達到 IND-EAV/CPA/CCA,至少不能被暴力搜尋或頻率分析打倒,但做到這點遠遠不夠。

L3.4cmL5.6cmL5.0cm 模型 & 敵手拿到什麼 & 本週的對應
唯密文(COA) & 只有密文(與訊息分布的先驗知識) & 頻率分析、Kasiski、trace、Problem 3
已知明文(KPA) & 若干 \((m_i,c_i)\) & 暴力搜尋的「檢查」步驟
選擇明文(CPA) & \(\Enc(\sk,\cdot)\) 預言機 & Problem 1 (ii)、Problem 2 (ii)
選擇密文(CCA) & 另加 \(\Dec(\sk,\cdot)\) 預言機 & OTP 的可塑性(§[sec:otp])

歷史密碼在最弱的 COA 下就倒了;現代定義要求在 CPA/CCA 下仍安全。

暴力搜尋(講義 p. 19)

就是窮舉某個空間——通常是 \(\calK\)——直到找到「對的」金鑰。講義的虛擬碼:

Input : message, ciphertext pairs (m_i, c_i)_i=1..N for k in K: for i in [N]: if Dec(k, c_i) != m_i: # k is wrong try next k return k # k is consistent with every pair

兩個講義提出的問題:

「is wrong」是什麼意思?

需要二選一:

  • 已知明文對:有 \((m_i,c_i)\) 可以比對,如上方虛擬碼。這時只要密文夠長,錯的金鑰幾乎不可能通過所有檢查。

  • 足夠的「語境」:只有密文(COA)時,改成「\(\Dec(k,c)\) 看起來像英文嗎?」。這需要關於訊息分布的先驗知識——以及夠長的密文,否則會有多把金鑰都給出合理的明文。

Shannon 定義 \(U=H(\calK)/D\),其中 \(D\) 是語言的冗餘度(英文每字母約 \(\log_226-1.5\approx3.2\) 位元)。粗略地說,密文長度超過 \(U\) 之後,「能解出合理英文」的錯誤金鑰期望數小於 1: \[U_{\text{Caesar}}\approx\frac{4.7}{3.2}\approx1.5,\qquad U_{\text{mono}}\approx\frac{88.4}{3.2}\approx28,\qquad U_{\text{Vigenère},n}\approx\frac{4.7n}{3.2}\approx1.5n .\] Problem 3 的三段密文(46、69、180 個字母)都遠超過各自的 \(U\),所以解是唯一的——這也是為什麼 (ii) 的 26 種位移只有一種讀得通。

為什麼用 \(\Dec\) 而不是 \(\Enc\)?

  1. 唯密文攻擊時根本沒有 \(m_i\) 可以加密:手上只有 \(c\),唯一能做的是對每把 \(k\) 算 \(\Dec(k,c)\),再判斷結果是否「像訊息」。

  2. 隨機化加密時 \(\Enc\) 不會重現 \(c_i\):若 \(\Enc\) 使用隨機數(Week 2 的 IND-CPA 方案都必須如此),\(\Enc(k,m_i)\) 即使 \(k\) 正確也幾乎不會等於 \(c_i\);但 \(\Dec(k,c_i)=m_i\) 對正確的 \(k\) 永遠成立(正確性)。

  3. \(\Dec\) 能一次排除整類金鑰:許多方案的 \(\Dec\) 會先檢查格式/填充/標籤,不合法就立刻拒絕,比較便宜。

對本週的三個確定性密碼,兩者剛好等價(\(\Enc(k,m_i)=c_i\iff\Dec(k,c_i)=m_i\)),但正確的習慣是寫 \(\Dec\)。

Problem 3 (ii) 的密文 :對 \(\sk=0,1,\dots,25\) 各算一次 \(\Dec\),只有 \(\sk=8\) 給出英文(§[sec:p3])。成本:\(26\) 次解密,每次 \(O(\ell)\)。 對替換密碼則是 \(26!\) 次——不可行;但 §[sec:p3] 會示範頻率分析如何在幾十步內完成。

頻率分析(講義 pp. 20–21)

講義 p. 20:假設 (1) 對訊息分布有先驗知識(例如:英文散文),且 (2) 加密沒有消除這個資訊。那麼比較密文的統計量與語言的統計量就是合法的攻擊。 Caesar/替換/換位密碼都滿足 (2):它們把每個字母送到固定的字母(或固定的位置),統計結構只是被重新標籤。

英文字母的相對頻率(%,典型語料值;講義 p. 20 列出前五名 e 12.7、t 9.1、a 8.2、o 7.5、i 7.0)。

還有哪些統計量可用(講義 p. 20)?

  • 雙字母(bigram):th、he、in、er、an、re、on、at、en、nd;三字母(trigram):the、and、ing、her、ere、ent。

  • 字首頻率:英文單字以 t、a、o、i、s、w 開頭最多(t 約 16%);字尾:e、s、d、t、n。

  • 雙寫字母:ll、ee、ss、oo、tt、ff。

  • 單字母單字:只有 和 (偶爾 )——Problem 3 (ii)、(iii) 都靠它。

  • 單字長度與重複單字:題目保留空白,等於多送了一份結構。

講義強調:「需要足夠但出奇地少的密文」——Problem 3 (iii) 只有 69 個字母。

手動頻率分析要「看起來像英文」,寫程式則需要可計算的分數:

  • 重合指數(Friedman 1920):從文本中隨機抽兩個不同位置,字母相同的機率 \[\IC(x)=\frac{\sum_{a\in\alpha}n_a(n_a-1)}{N(N-1)} ,\] 其中 \(n_a\) 是字母 \(a\) 的出現次數、\(N\) 是總長度。英文約 \(0.0655\);均勻隨機文字為 \(1/26\approx0.0385\)。Caesar/替換/換位都保持 \(\IC\)(重新標籤不改變 \(\sum n_a(n_a-1)\)),Vigenère 則把它壓向 \(0.0385\)——這正是判斷金鑰長度的依據(§[sec:p3])。

  • \(\chi^2\) 統計量:對每個候選位移 \(k\),把密文平移 \(-k\) 後計算 \[\chi^2_k=\sum_{a\in\alpha}\frac{(n_a-Np_a)^2}{Np_a},\] \(p_a\) 是英文頻率。正確的 \(k\) 給出最小的 \(\chi^2\),而且通常遠小於其他 25 個——比「最多的字母是 e」穩健得多(§[sec:p3] (iv) 的第二條子密文就是「最多的字母不是 e」的例子)。

  • 內積法:最大化 \(\sum_a p_a\cdot n_{a+k}/N\),效果類似。

Vigenère 的頻率分析(講義 p. 21)。

給定 \(c=c_1c_2\cdots c_\ell\) 與金鑰長度上限 \(n\):

  1. 對每個候選長度 \(i\in[n]\),把密文分成 \(i\) 條子密文: \[c_1c_{1+i}c_{1+2i}\cdots,\quad c_2c_{2+i}c_{2+2i}\cdots,\quad\dots,\quad c_ic_{2i}c_{3i}\cdots\] (講義寫成 \(c_{i-1}c_{2i-1}c_{3i-1}\cdots\) 是最後一條的另一種寫法;共 \(i\) 條,每條是一個 Caesar 密碼)。

  2. 對每條子密文做頻率分析求出位移;若「沒有一條讀得通」就換下一個 \(i\)。

兩個更快求 \(i\) 的方法:

  • Kasiski 檢驗(1863):密文中重複出現的三字母以上片段,多半來自「同一段明文碰到同一段金鑰」,因此它們的距離是金鑰長度的倍數;取所有距離的最大公因數。短密文時雜訊很多(§[sec:p3] (iv) 中 180 個字母只有兩組重複三字母,距離 90 與 16,\(\gcd=2\),是錯的!)。

  • Friedman 的 \(\IC\) 檢驗(1920):對每個 \(i\) 算 \(i\) 條子密文的平均 \(\IC\);正確的 \(i\)(及其倍數)會跳回 \(\approx0.065\),其餘留在 \(\approx0.045\)。對短密文更可靠。

總成本:至多 \(n\) 個長度 \(\times\) 每長度 \(26\cdot i\) 個位移 \(=O(26n^2)\),與 \(26^n\) 天差地遠。

Bonus weakness:trace(講義 p. 22)

講義 p. 22 的標題是「Veni vidi explicavi」(我來、我見、我解釋)。Caesar 密碼「特別糟糕」:相鄰字母之間的間距(gap)完全不變。

對字串 \(w=w_1w_2\cdots w_\ell\in\alpha^\ell\)(視為 \((\Zn{26})^\ell\)),定義 \[\trace(w)=(w_2-w_1,\ w_3-w_2,\ \dots,\ w_\ell-w_{\ell-1})\in(\Zn{26})^{\ell-1}.\] 例:\(\trace(\ct{hello})=(\ct{e}-\ct{h},\ct{l}-\ct{e},\ct{l}-\ct{l},\ct{o}-\ct{l})=(-3,7,0,3)=(23,7,0,3)\)。

對任意 \(\sk\in\Zn{26}\) 與 \(m\in\alpha^\ell\),\(\trace(\Enc(\sk,m))=\trace(m)\)。

Proof. \(c_{i+1}-c_i=(m_{i+1}+\sk)-(m_i+\sk)=m_{i+1}-m_i\),金鑰互相抵消。 ◻

講義的例子:\(\sk=1\),\(\Enc(1,\ct{hello})=\ct{ifmmp}\),\(\trace(\ct{ifmmp})=(\ct{f}-\ct{i},\ct{m}-\ct{f},\ct{m}-\ct{m},\ct{p}-\ct{m})=(23,7,0,3)\) ✓。

密文 \(c\) 有可能解密成 \(m\)(即存在 \(\sk\) 使 \(\Dec(\sk,c)=m\))若且唯若 \(\trace(c)=\trace(m)\)(且長度相同)。

Proof. (\(\Rightarrow\))由引理。 (\(\Leftarrow\))設 \(\trace(c)=\trace(m)\)。令 \(\sk:=c_1-m_1\)。歸納證明 \(c_i=m_i+\sk\) 對所有 \(i\) 成立:\(i=1\) 由定義;若 \(c_i=m_i+\sk\),則 \(c_{i+1}=c_i+(c_{i+1}-c_i)=m_i+\sk+(m_{i+1}-m_i)=m_{i+1}+\sk\),其中第二個等號用了 \(\trace\) 相等。故 \(\Dec(\sk,c)=m\)。 ◻

把常見單字的 trace 背起來或列表:

單字 trace 單字 trace
the (14, 23) and (13, 16)
hello (23, 7, 0, 3) yes (6, 14)
no (1) you (16, 6)
blue (10, 9, 10) come (12, 24, 18)

在密文中找到長度相同、trace 相同的單字,\(\sk=c_1-m_1\) 就出來了。Problem 3 (ii) 的 的 trace 是 \((10,9,10)\)——與 相同;\(\sk=\ct{j}-\ct{b}=9-1=8\)。 這比暴力搜尋更快:不必嘗試 26 把金鑰,只需比對一次。

  • Vigenère(金鑰長度 \(j\)):相鄰字母的差不再守恆,但相距 \(j\) 的字母的差守恆:\(c_{i+j}-c_i=m_{i+j}-m_i\)。這是 Kasiski 檢驗的本質——同一段明文在相距 \(j\) 的倍數處會給出相同密文。

  • 替換密碼:差值不守恆,但「哪些位置的字母相同」這個模式守恆:(模式 ABCA)加密後仍是 ABCA。Problem 3 (iii) 中 與 的重複就是這種「同構」(isomorph)資訊。

  • OTP:\(c_{i+1}-c_i=m_{i+1}-m_i+(\sk_{i+1}-\sk_i)\),而 \(\sk_{i+1}-\sk_i\) 本身均勻且獨立於訊息——什麼都不守恆。這就是 §[sec:perfect] 的完美保密。

  • 能寫出暴力搜尋虛擬碼,並說明為何用 \(\Dec\)(唯密文時沒有 \(m\);隨機化加密時 \(\Enc\) 不重現 \(c\))。

  • 能解釋「is wrong」需要先驗知識或明文對,以及為何密文要夠長(唯一解距離)。

  • 頻率分析的兩個前提;Vigenère 要先分流再逐條分析;知道 Kasiski 與 \(\IC\) 的原理。

  • trace 的定義、守恆引理、「若且唯若」命題的證明(關鍵:令 \(\sk=c_1-m_1\) 再歸納)。

  • 最重要的:這些攻擊都不是證明不安全的必要手段——IND-EAV 的一對 \(m_0,m_1\) 就夠了。