直覺與困難(講義 p. 13)

直覺:不知道 \(\sk\) 的敵手,不應該能「學到」任何關於訊息的「有意義」資訊,即使它能

  1. 觀察密文(被動竊聽,eavesdropping);

  2. 選擇訊息讓對方加密、並看到對應密文(選擇明文,chosen plaintext);

  3. 選擇訊息讓對方加密,並且選擇(某些)密文讓對方解密、看到結果(選擇密文,chosen ciphertext)。

問題是「學到」與「有意義」都不是數學。Week 1 的教訓是:安全定義必須同時說清(\(\ast\))敵手不能做什麼與(\(\dagger\))敵手能做什麼。本週的工具是:一個 \(\chal\) 依規則與 \(\adv\) 互動,最後判定 \(\adv\) 是否「獲勝」。(\(\dagger\))由 \(\adv\) 可用的決定,(\(\ast\))由獲勝條件決定。

在每個遊戲裡,演算法 \((\KGen,\Enc,\Dec)\) 都是公開的(\(\adv\) 知道、甚至可以自己執行),只有 \(\sk\) 是秘密。這就是 。

IND-EAV:對竊聽者的不可區分性(講義 p. 14)

遊戲(INDistinguishability against EAVesdroppers;KL-IMC §3.2.1)。

\(\SKE\) 是 安全的,若對每一個有效率的(PPT)敵手 \(\adv\), \[\Prob\bigl[\adv\ \text{在 \game{IND-EAV} 遊戲中獲勝}\bigr]\ \le\ \tfrac12+\negl ,\] 其中機率對 \(\sk\)、\(b\)、\(\Enc\) 與 \(\adv\) 的隨機性取。等價地, \(\Adv^{\mathrm{ind\text{-}eav}}_{\SKE}(\adv)=\bigl|\Prob[b'=b]-\tfrac12\bigr|\) 是可忽略的。

讀法:\(\adv\) 自己挑兩個等長訊息(它認為最容易被分辨的兩個),挑戰者隨機加密其中一個,\(\adv\) 只看到一個密文,要猜是哪一個。如果連 \(\adv\) 自選的最有利情況都猜不準,它對任何訊息都學不到任何事。

IND-CPA:選擇明文攻擊(講義 p. 15)

遊戲(KL-IMC §3.4.2)。綠色虛線是加密預言機 \(\OEnc\),挑戰前後皆可呼叫、次數任意(多項式)。

\(\SKE\) 是 安全的,若對每一個 PPT 敵手 \(\adv\)(可存取 \(\OEnc(\cdot)=\Enc(\sk,\cdot)\)),\(\Prob[\adv\ \text{獲勝}]\le\tfrac12+\negl\)。

為什麼要給敵手加密預言機?因為現實中敵手常能讓你加密它選的內容:Week 1 的中途島故事(誘使日軍發出含「AF」的電報)、網頁瀏覽器替攻擊者的 JavaScript 加密含有 cookie 的請求(BEAST、CRIME 攻擊的前提)、加密資料庫替使用者上傳的資料加密。IND-CPA 說:即使敵手能看到任意多個「自選明文」的密文,仍然分不出挑戰密文。

若 \(\Enc\) 是確定性的(且無內部狀態),則存在一個只做一次預言機查詢、必勝的 敵手。

Proof. \(\adv\) 任選兩個等長且相異的訊息 \(m_0\ne m_1\)。先查詢 \(\OEnc(m_0)\),得 \(c^*=\Enc(\sk,m_0)\)。再送出挑戰 \((m_0,m_1)\),收到 \(c_b\)。若 \(c_b=c^*\) 輸出 \(b'=0\),否則輸出 \(b'=1\)。 因為 \(\Enc\) 確定,\(b=0\) 時 \(c_b=\Enc(\sk,m_0)=c^*\),必輸出 \(0\);\(b=1\) 時 \(c_b=\Enc(\sk,m_1)\),而由正確性 \(\Esk\) 是單射(Problem 1 (v)),\(\Enc(\sk,m_1)\ne\Enc(\sk,m_0)=c^*\),必輸出 \(1\)。故 \(\Prob[b'=b]=1\)。 ◻

Caesar、Vigenère、單字母替換、Enigma……所有確定性的歷史密碼,以及任何「直接用區塊加密逐塊加密」的 ECB 模式,都不是 IND-CPA 安全的。要通過 IND-CPA,\(\Enc\) 必須隨機化(\(\rho\gets\calR\))或有狀態(例如維護一個不重複的計數器 nonce)。

事實上許多歷史密碼連更弱的 IND-EAV 都過不了:

\(\adv\) 送出 \(m_0=\mathrm{aa}\)、\(m_1=\mathrm{ab}\)。收到 \(c_b=c_1c_2\) 後,若 \(c_1=c_2\) 輸出 \(0\),否則輸出 \(1\)。Caesar 對每個字母加同一個位移,\(\mathrm{aa}\) 的兩個密文字母相同、\(\mathrm{ab}\) 的不同,故 \(\adv\) 必勝。\(\adv\) 甚至不需要知道金鑰——這正是「不可區分」的威力:不用恢復金鑰、不用恢復訊息,只要洩漏任何一點點可分辨的東西就算輸。

IND-CCA:選擇密文攻擊(講義 p. 16)

遊戲(KL-IMC §5.1.2)。紅色虛線是解密預言機 \(\ODec\);唯一的限制是不能拿挑戰密文 \(c_b\) 本身去解密。

\(\SKE\) 是 安全的,若對每一個 PPT 敵手 \(\adv\)(可存取 \(\OEnc\) 與受限的 \(\ODec\)),\(\Prob[\adv\ \text{獲勝}]\le\tfrac12+\negl\)。

不限制的話遊戲就無聊了:\(\adv\) 把 \(c_b\) 丟給 \(\ODec\) 拿回 \(m_b\),必勝。這與 Week 1 EUF-CMA 的「\(m'\notin\calQ\)」是同一種「排除平凡勝利」的規則:定義要排除所有我們在意的攻擊,又不能把不可能避免的事算成攻擊。注意只有 \(c_b\) 本身被禁止——\(\adv\) 可以把 \(c_b\) 改一個位元再送去解密。因此 IND-CCA 安全蘊含:改動密文必須導致 \(\bot\) 或與 \(m_b\) 無關的結果。

CCA 捕捉什麼現實?Week 1 提過的 padding oracle(Vaudenay 2002)與 Bleichenbacher(1998)攻擊:伺服器對「格式錯」與「格式對」的密文回應不同(錯誤訊息、時間),這就是一個(部分的)解密預言機;只要洩漏一個位元的解密資訊,就可能逐步解出整個訊息。

考慮「隨機 nonce + 金鑰串流」的加密(CTR 模式或 ChaCha20 不帶 MAC):\(c=(\nu,\ m\oplus G(\sk,\nu))\),\(\nu\) 每次新抽。它是 IND-CPA 安全的(之後幾週會證明)。但 \(\adv\) 在 CCA 遊戲中可以:收到 \(c_b=(\nu,z)\) 後,送 \(c'=(\nu,\ z\oplus 10\cdots0)\ne c_b\) 給 \(\ODec\),拿回 \(m_b\oplus10\cdots0\),翻回第一個位元就得到 \(m_b\),必勝。這就是 Week 1「一次性密碼本可延展」的遊戲版。補救:Encrypt-then-MAC(Week 1 Problem 1 (iii))——Bellare–Namprempre 證明 IND-CPA 的 \(\Enc\) 加上 SUF-CMA 的 MAC 給出 IND-CCA。

為什麼是「不可區分」?(講義 p. 17)

講義的例子:設 \(\calM=\bits^*\),而 \(\adv\) 能從 \(c\gets\Enc(\sk,m)\) 判斷 \(m\) 的(1 的個數)。它如何贏 IND-EAV?送出 \(m_0=0\)、\(m_1=1\):兩者等長、漢明重量分別為 \(0\) 與 \(1\),看 \(c_b\) 判斷重量就知道 \(b\)。

把例子一般化:假設 \(\adv\) 能從密文計算任何關於訊息的函數 \(f(m)\)(第一個位元、是否含某字、長度以外的任何統計量……),只要存在兩個等長訊息 \(f(m_0)\ne f(m_1)\),\(\adv\) 就把它們當挑戰,用 \(f\) 分辨 \(b\)。逆否命題:IND 安全 \(\Rightarrow\) 沒有任何(可有效計算的)訊息函數能從密文學到。KL-IMC 定理 3.13 把這件事嚴格化:IND-EAV 等價於——「有密文」與「沒有密文」時,敵手對 \(f(m)\) 的猜測能力相同。 若 \(\adv\) 需要加密預言機才能算出 \(f\)(例如要先收集統計資料),同樣的論證給出 IND-CPA;需要解密預言機則給出 IND-CCA(講義 p. 17 最後一行)。

為什麼讓 \(\adv\) 自己挑 \(m_0,m_1\)?因為我們要的是最壞情況保證:對每一對訊息都分不出來,自然對 \(\adv\) 自選的最有利一對也分不出來,反之亦然。

為什麼是二分之一?(講義 p. 18)

\(\SKE\) 是 IND-{EAV, CPA, CCA} 安全的,若沒有有效率的敵手 \(\adv\) 能以明顯異於二分之一的機率贏得對應的遊戲。

為什麼是 \(\tfrac12\)?因為任何人都可以直接猜 \(b\)(擲硬幣),獲勝機率恰為 \(\tfrac12\);這是「什麼都沒學到」的基準線。注意兩件事:

  • 「明顯異於」是雙向的:若某 \(\adv\) 以 \(\tfrac12-0.3\) 的機率獲勝,把它的輸出 \(b'\) 反過來就以 \(\tfrac12+0.3\) 獲勝。所以優勢定義成 \(\bigl|\Prob[b'=b]-\tfrac12\bigr|\)。

  • 「明顯」的精確意義是「不可忽略」(non-negligible),「有效率」是 PPT——§[sec:adversaries] 說明。

三個概念的強弱關係

給敵手愈多預言機,定義愈強。箭頭方向是「蘊含」;反向都不成立(分離例子)。
  • 蘊含:任何 IND-EAV 敵手也是一個(不用預言機的)IND-CPA 敵手,任何 IND-CPA 敵手也是一個(不用 \(\ODec\) 的)IND-CCA 敵手。因此 CCA 安全 \(\Rightarrow\) CPA 安全 \(\Rightarrow\) EAV 安全。

  • 分離:一次性密碼本(金鑰只用一次)是完美的 IND-EAV(任何敵手恰好 \(\tfrac12\)),卻因確定性而不是 IND-CPA(定理 [thm:det-not-cpa]);隨機化串流加密是 IND-CPA 卻不是 IND-CCA(上面的可延展例子)。

L2.2cmL3.0cmL4.2cmL5.0cm 遊戲 & 預言機(\(\dagger\)) & 獲勝條件(\(\ast\)) & 現實對應
& 無 & 猜中 \(b\);基準 \(\tfrac12\) & 被動竊聽一則訊息
& \(\OEnc\)(挑戰前後) & 同上 & 敵手能誘使你加密它選的內容
& \(\OEnc\)、\(\ODec\)(\(c\ne c_b\)) & 同上 & padding oracle、錯誤訊息、任何解密結果的回饋
& \(\OTag\) & 偽造新訊息的合法標籤;基準 \(0\) & 竄改/偽造訊息(§[sec:eufcma])

為什麼要求 \(\abs{m_0}=\abs{m_1}\)?

因為加密無法隱藏長度(在 \(\calM=\alpha^*\) 的一般設定下):一則 1 KB 與一則 1 GB 的訊息,密文長度必然不同,否則所有訊息都得被填充到最大長度——而 \(\alpha^*\) 沒有最大長度。所以定義誠實地把長度排除在保護範圍外。這是一個真實的洩漏來源:

  • 流量分析:加密的語音封包長度洩漏說話內容的音節結構;加密網頁的大小洩漏你在看哪一頁。

  • CRIME(2012)與 BREACH(2013):TLS/HTTP 在加密前先壓縮,攻擊者注入自選字串,觀察密文長度是否變短,逐字猜出 cookie——完全只用「長度」就攻破了 IND-CPA 安全的加密。對策是不要在加密前壓縮秘密與攻擊者可控資料的混合物。

若系統需要隱藏長度,必須在協定層做填充(padding)到固定長度桶,這是加密定義之外的事。

  • 能畫出三個 IND 遊戲,並說明每一行:\(\sk\gets\KGen\)、\(b\gets\bits\)、\(\abs{m_0}=\abs{m_1}\)、\(c_b\)、\(\ODec(c_b)=\bot\)、輸出 \(b'\)、獲勝條件。

  • 能寫出安全定義的句型:「沒有 PPT 敵手能以明顯異於 \(\tfrac12\) 的機率獲勝」,並解釋 \(\tfrac12\) 的來源。

  • 能證明確定性加密不是 IND-CPA;能給出 Caesar 不是 IND-EAV 的敵手。

  • 能說明 CCA \(\Rightarrow\) CPA \(\Rightarrow\) EAV 與兩個分離例子;能解釋漢明重量例子如何說明「IND 捕捉一切洩漏」。