三個密碼的共同模式(講義 p. 16)
回顧三節:每一個方案的生命週期都是
講義稱這是「不講原則的」(unprincipled):
Caesar:金鑰太少 \(\Rightarrow\) 暴力搜尋。「修補」:換成替換密碼。
替換密碼:\(26!\) 把金鑰,但同一字母永遠映到同一字母 \(\Rightarrow\) 頻率分析。「修補」:Vigenère。
Vigenère:頻率被抹平,但金鑰週期性 \(\Rightarrow\) Kasiski/Friedman 分流後逐段頻率分析。「修補」:……?
每一次「修補」都只針對上一個攻擊,沒有人問「我們到底想抵擋哪一類敵手?」。 在這種循環裡,一個方案「安全」的唯一證據是「目前還沒有人破解它」——Vigenère 頂著「不可破解」的名號三百年,就是這種證據有多薄弱的最佳示範。
Katz–Lindell 的現代密碼學三原則(Week 2 §1)正是對這種循環的回應:
精確定義:先說清楚「安全」是什麼(例如 IND-CPA)。這週會看到歷史上第一個這樣的定義——Shannon 的完美保密(§[sec:perfect])。
明確假設:若需要計算假設,必須清楚陳述(下週起:PRG、PRF)。本週的完美保密不需要任何假設。
安全性證明:證明「若假設成立,則方案滿足定義」。對完美保密,證明是無條件的、純機率論的。
有了定義,我們就不必等待下一個攻擊:一個被證明滿足 IND-CPA 的方案,任何符合模型的攻擊都被排除了。 而且一旦定義是對的,「修補」也有方向:Vigenère 之所以失敗,是因為它連「兩個訊息不可區分」這麼弱的要求都達不到。
換位密碼不會改變結論(講義 p. 17)
講義 p. 17 提醒:本週只討論了替換(substitution)式的密碼——字母被換成別的字母,但位置不變。 另一大類歷史密碼是:字母本身不變,只是位置被打亂。
密碼棒(scytale,斯巴達,約西元前 5 世紀):把羊皮紙條纏在直徑固定的棒子上橫著寫,拆下來後字母順序就被打亂;金鑰是棒子的直徑(等價於「每列幾個字母」)。 例:\(m=\ct{helpmeiamunderattack}\)(20 字母),以 4 列 \(\times\) 5 行寫入、按行讀出:
h e l p m e i a m u n d e r a t t a c k \(\longrightarrow\)\(c=\ct{hent eidt laea pmrc muak}\)
柵欄密碼(rail fence):金鑰是列數 \(r\),明文沿鋸齒線寫在 \(r\) 列上,再逐列讀出。\(r=3\)、\(m=\ct{wearediscoveredfleeatonce}\) 得 \(c=\ct{wecrlteerdsoeefeaocaivden}\)。
欄位換位(columnar transposition):金鑰是一個關鍵字,明文按列寫成矩陣,依關鍵字字母的字典序重排欄位後逐欄讀出。一戰德軍的 ÜBCHI、二戰 SOE 的雙重欄位換位都是它的變形。
為什麼換位不會改變我們的結論?
字母頻率完全不變:密文只是明文的重排, 還是最多;這恰好是辨認「這是一個換位密碼」的指紋(密文字母分布與英文幾乎相同,但讀不通)。攻擊者接著以 anagramming——依常見雙字母、三字母組合試著重組——還原順序。
同樣是確定性加密:\(m_0=\ct{aaaa}\)、\(m_1=\ct{aaab}\)——換位後 \(m_0\) 的密文仍是 ,\(m_1\) 的密文含一個 ,一次查詢就能區分。更直接地,\(m_0=\ct{ab}\cdots\) 與 \(m_1=\ct{ba}\cdots\) 的密文是同一多重集合,但只要密文與選定明文不同就知道發生了換位。
組合起來也一樣:替換 \(\circ\) 換位(乘積密碼,product cipher)仍是確定性、無狀態的函數,Week 2 定理 6.1 依然適用。乘積密碼是現代分組密碼(DES、AES)的設計思想,但那些方案的安全性來自金鑰相依的、經過大量輪數的混淆與擴散,而且必須搭配隨機化的操作模式——不是「換位加替換」本身。
講義 p. 16 的核心訊息是:我們需要定義而非「換一個更複雜的方案」。 遇到「某某古典密碼安全嗎?」這類問題,標準答案結構是: (1) 指出它是確定性加密,寫下 Week 2 的 IND-EAV(或 IND-CPA)遊戲; (2) 給出一對具體的 \(m_0,m_1\) 與敵手的判斷規則; (3) 計算敵手獲勝的機率(通常是 \(1\),即優勢 \(\tfrac12\) 達到最大)。 這比描述頻率分析更簡潔,也更「有原則」。頻率分析、Kasiski 等方法是更強的攻擊(直接還原金鑰、而且是唯密文攻擊),考試中若被要求「破解」才需要。