我們已經看到古典密碼不安全,而像一次性密碼本這樣完美安全的密碼又不實用。因此若想要既安全又可用的密碼,就得在安全性上讓步一些。
但除了「竊聽者無法解密」這種顯而易見又不精確的說法之外,「安全」到底是什麼意思?
直覺上,一個密碼是安全的,若即使給定大量的明文—密文對,也無法學到該密碼在其他明文或密文上的行為。這隨即引出兩個問題:
- 攻擊者是怎麼取得這些配對的?「大量」是多大?——這由攻擊模型(attack models)定義,也就是對攻擊者能做什麼、不能做什麼的假設。
- 能「學到」什麼?我們談的是哪種「密碼的行為」?——這由安全目標(security goals)定義,也就是對什麼算成功攻擊的描述。
攻擊模型與安全目標必須成對出現。你不能只宣稱一個系統「安全」,卻不說明它是對誰安全、防的是什麼。
安全概念(security notion)就是某個安全目標與某個攻擊模型的組合。我們說一個密碼達成某個安全概念,意思是任何在該模型下運作的攻擊者都無法達成該安全目標。
攻擊模型#
攻擊模型是一組假設,描述攻擊者可能如何與密碼互動、以及他們能做與不能做什麼。它的目標有三:
- 為設計密碼的密碼學家設定需求,讓他們知道要防範哪些攻擊者與哪類攻擊。
- 為使用者提供指引,判斷某個密碼在他們的環境中是否安全可用。
- 為密碼分析者提供線索,讓他們知道某個攻擊是否有效——一個攻擊只有在所考慮的模型中可行時才算有效。
攻擊模型不需要完全符合現實,它們是一種近似。
統計學家 George E. P. Box 說過:「所有模型都是錯的;實際的問題是它們要錯到什麼程度才會變得沒用。」
在密碼學中,模型至少要涵蓋攻擊者實際上能對密碼做的事。模型高估攻擊者的能力是可以接受、甚至是好事,因為這有助於預先防範未來的攻擊技術——只有偏執的密碼學家才能存活。壞的模型則低估攻擊者,讓密碼在理論上看似安全、實際上並不安全,因而給出虛假的信心。
柯克霍夫原則#
所有模型都會做的一個假設,是所謂的柯克霍夫原則(Kerckhoffs’s principle):密碼的安全性應該只依賴金鑰的保密,而不依賴密碼本身的保密。
這在今天聽來理所當然,因為密碼與協定都公開規範、人人可用。但在歷史脈絡下,荷蘭語言學家柯克霍夫(Auguste Kerckhoffs)談的是為特定軍隊或師團專門設計的軍用加密機器。他在 1883 年的論文〈軍事密碼學〉(“La Cryptographie Militaire”)中列出軍用加密系統的六項要求,其中一項是:「系統不得要求保密,且可以被敵人竊取而不造成麻煩。」
黑箱模型#
黑箱模型(black-box models)之所以這樣命名,是因為攻擊者只看得到進出密碼的東西。
這裡的查詢(query)指的是把一個輸入值送進某個函式並取回輸出,但不暴露該函式的內部細節。例如一次加密查詢接收明文、回傳對應的密文,但不洩漏秘密金鑰。
這是有現實對應的:某些智慧卡晶片牢牢保護密碼的內部結構與金鑰,但允許你連接晶片、要求它解密任意密文。攻擊者於是取得對應的明文,這可能幫助他們推出金鑰。
黑箱攻擊模型有數種,以下由弱到強排列:
僅密文攻擊者(COA,ciphertext-only attackers):只能觀察密文,不知道對應的明文,也不知道明文是如何挑選的。COA 模型下的攻擊者是被動的,無法執行加密或解密查詢。
已知明文攻擊者(KPA,known-plaintext attackers):觀察密文,並且知道對應的明文。KPA 模型下的攻擊者拿到一份明文—密文對的清單,其中明文假設是隨機選出的。KPA 同樣是被動攻擊者模型。
選擇明文攻擊者(CPA,chosen-plaintext attackers):可以對自己挑選的明文執行加密查詢,並觀察產生的密文。這個模型描述的是攻擊者能選擇全部或部分被加密的明文、然後看到密文的情境。與 COA、KPA 不同,CPA 是主動攻擊者,因為他們影響了加密的過程,而非被動竊聽。
選擇密文攻擊者(CCA,chosen-ciphertext attackers):既能加密也能解密,亦即可以執行加密查詢與解密查詢。
CCA 模型乍聽荒謬——如果你都能解密了,還需要什麼?但與 CPA 模型一樣,它描述的是攻擊者能對密文施加某些影響、稍後又取得明文的情境。
而且「能解密」不代表就攻破了系統。例如某些影音保護裝置允許攻擊者用裝置的晶片執行加密與解密查詢,但攻擊者真正想要的是金鑰(以便轉發散布);在這種情境下,能「免費」解密並不足以攻破系統。
在上述模型中,被觀察與被查詢的密文都不是免費的。每個密文都來自一次加密函式的計算,這意味著透過加密查詢產生 2^N 個明文—密文對,其計算量大約等同於嘗試 2^N 把金鑰。計算攻擊成本時必須把查詢的成本算進去。
灰箱模型#
在灰箱模型(gray-box model)中,攻擊者能接觸到密碼的實作。對智慧卡、嵌入式系統、虛擬化系統這類應用而言,灰箱模型比黑箱模型更貼近現實,因為攻擊者往往有實體存取權,能夠竄改演算法的內部。
也正因如此,灰箱模型比黑箱模型更難定義:它們取決於實體與類比特性,而不只是演算法的輸入與輸出,而密碼學理論常常無法抽象化真實世界的複雜度。
旁道攻擊(side-channel attacks)是灰箱模型中的一類攻擊。旁道(side channel)是一個依賴於密碼實作(無論軟體或硬體)的資訊來源。旁道攻擊者觀察或測量密碼實作的類比特徵,但不改變其完整性——他們是非侵入式的。
- 純軟體實作的典型旁道:執行時間、以及密碼周邊系統的行為,例如錯誤訊息、回傳值、分支等。
- 智慧卡實作的典型旁道:功率消耗、電磁輻射、聲學噪音。
侵入式攻擊(invasive attacks)比旁道攻擊更強大,也更昂貴,因為需要精密設備。基本的旁道攻擊用一台標準 PC 加一台現成示波器就能做,但侵入式攻擊需要高解析度顯微鏡與化學實驗室。這類攻擊涵蓋一整套技術與程序:用硝酸去除晶片封裝、顯微影像擷取、部分逆向工程,乃至用雷射故障注入修改晶片行為。
安全目標#
前面我們非正式地把安全目標定義為「無法學到關於密碼行為的任何事」。要把這個想法變成嚴謹的數學定義,密碼學家定義了兩個主要的安全目標,對應「學到關於密碼行為的事」的兩種不同理解:
不可區分性(IND,indistinguishability):密文應該與隨機字串無法區分。這通常用一個假想的遊戲來說明——攻擊者挑兩段明文,接著收到其中之一(隨機選)的密文,他們應該無法分辨加密的是哪一段明文,即使他們可以對這兩段明文執行加密查詢(若模型是 CCA 而非 CPA,還可以執行解密查詢)。
不可鍛造性(NM,non-malleability):給定密文
C₁ = E(K, P₁),應該不可能造出另一個密文C₂,使其對應的明文P₂與P₁有有意義的關聯(例如造出P₂ = P₁ ⊕ 1,或P₂ = P₁ ⊕ X其中X為已知值)。
令人意外的是,一次性密碼本是可鍛造的:給定
C₁ = P₁ ⊕ K,你可以定義C₂ = C₁ ⊕ 1,它在同一把金鑰K下是P₂ = P₁ ⊕ 1的一個有效密文。我們的「完美密碼」在這裡就失守了。
安全概念#
安全目標只有與攻擊模型結合才有用。慣例上,安全概念寫成 GOAL-MODEL 的形式。例如 IND-CPA 表示「對選擇明文攻擊者的不可區分性」,NM-CCA 表示「對選擇密文攻擊者的不可鍛造性」。
語意安全與隨機化加密:IND-CPA#
最重要的安全概念是 IND-CPA,也稱為語意安全(semantic security)。它捕捉的直覺是:只要金鑰保密,密文就不該洩漏任何關於明文的資訊。
要達成 IND-CPA 安全,對同一段明文呼叫兩次加密必須回傳不同的密文。否則攻擊者能從密文中辨識出重複的明文,這就與「密文不該洩漏任何資訊」的定義相矛盾。
達成 IND-CPA 的一個方法是使用隨機化加密(randomized encryption)。顧名思義,它把加密過程隨機化,使同一段明文加密兩次會得到不同的密文。加密可表示為 C = E(K, R, P),其中 R 是新鮮的隨機位元。解密則仍然是確定性的:給定 D(K, R, C),無論 R 的值為何,你都應該得到 P。
如果加密不隨機化會怎樣? 在 IND 遊戲中,攻擊者挑兩段明文 P₁、P₂,收到其中之一的密文 Cᵢ = E(K, Pᵢ),必須猜出 i 是 1 還是 2。在 CPA 模型下,攻擊者可以執行加密查詢,自行算出 C₁ = E(K, P₁) 與 C₂ = E(K, P₂)。若加密不隨機化,只要比對 Cᵢ 等於 C₁ 還是 C₂ 就能判定加密的是哪一段明文,直接贏得 IND 遊戲。因此隨機化是 IND-CPA 概念的關鍵。
採用隨機化加密時,密文必須比明文稍長,才容納得下「每段明文對應多於一個可能密文」。例如若每段明文對應 2^64 種可能密文,密文就必須比明文至少長 64 位元。
建構語意安全的加密#
語意安全密碼最簡單的建構之一,使用確定性隨機位元產生器(DRBG,deterministic random bit generator)——一個給定某個秘密值就回傳看似隨機之位元的演算法:
E(K, R, P) = ( DRBG(K ‖ R) ⊕ P , R )這裡 R 是每次新加密時隨機挑選的字串,與金鑰一起餵給 DRBG(K ‖ R 表示 K 後接 R 的字串)。這個做法讓人想起一次性密碼本:我們不再挑一把與訊息等長的隨機金鑰,而是靠隨機位元產生器取得一串看似隨機的字串。
延伸:這個建構為何是 IND-CPA 安全的(反證法)
假設 DRBG 產生的是隨機位元,證明相當簡單,用反證法:
若你能把密文與隨機字串區分開來,就代表你能把 DRBG(K ‖ R) ⊕ P 與隨機區分開來,也就代表你能把 DRBG(K ‖ R) 與隨機區分開來。
記得 CPA 模型允許你取得自選 P 值的密文,所以你可以把 P 與 DRBG(K ‖ R) ⊕ P 做 XOR,得到 DRBG(K ‖ R)。
但這就產生矛盾了,因為我們一開始就假設 DRBG(K ‖ R) 無法與隨機區分。因此我們的結論是:密文無法與隨機字串區分,該密碼是安全的。
各安全概念之間的關係#
攻擊模型(CPA、CCA)與安全目標(NM、IND)組合出 NM-CPA、NM-CCA、IND-CPA、IND-CCA 四個概念。它們之間的關係如下:
IND-CCA ⟹ IND-CPA,NM-CCA ⟹ NM-CPA。 這很明顯:CPA 攻擊者做得到的事,CCA 攻擊者也做得到。如果你無法透過選擇密文與選擇明文查詢破解一個密碼,那你也無法只靠選擇明文查詢破解它。
IND-CPA ⟹̸ NM-CPA(不蘊含)。前面那個 IND-CPA 建構
(DRBG(K, R) ⊕ P, R)就不是 NM-CPA:給定密文(X, R),你可以造出(X ⊕ 1, R),它是P ⊕ 1的一個有效密文,因此違反了不可鍛造性。NM-CPA ⟹ IND-CPA(反向成立)。
一個直覺的類比:IND-CPA 加密像是把東西放進一個袋子——你看不到裡面的東西,但可以透過上下搖晃來重新排列它們的位置。NM-CPA 則像一個保險箱——東西一旦放進去,你就無法與之互動。
不過這個類比對 IND-CCA 與 NM-CCA 不適用:這兩者是等價的概念,彼此互相蘊含。
延伸:加密應用的兩種型態
加密應用主要有兩種型態:
傳輸中加密(in-transit encryption)保護從一台機器送往另一台機器的資料:資料在送出前加密、收到後解密,例如連往電子商務網站的加密連線。
靜態加密(at-rest encryption)保護儲存在資訊系統中的資料:資料寫入記憶體前加密、讀取前解密,例如筆電上的磁碟加密系統,以及雲端虛擬執行個體的虛擬機器加密。
我們看到的安全概念對兩種型態都適用,但該考慮哪一個概念才恰當,可能取決於應用。