我應該為我的分組密碼使用 ECB 還是 CBC 加密模式?
誰能告訴我ECB和CBC中哪種模式更好,以及如何決定使用哪種模式?還有其他更好的模式嗎?
對於兩者之間的區別,真正簡單的解釋是:
- ECB(電子密碼本)基本上是原始密碼。對於每個輸入塊,您加密該塊並獲得一些輸出。這種轉換的問題在於,明文的任何常駐屬性都可能出現在密文中——可能不那麼清楚——這就是塊和密鑰計劃應該保護的內容,但分析模式你可能能夠推斷出屬性你否則認為是隱藏的。
- CBC 模式是密碼塊連結的縮寫。你有一個初始化向量,你對它的第一個純文字塊進行異或。然後,您加密該明文塊。在加密這個塊之前,下一個明文塊與最後一個加密塊進行異或。 (來自維基共享資源的公共領域圖像。)
CBC 相對於 ECB 的優勢有很多——使用 ECB,假設有很多事情,您可以管理部分解密並輕鬆填補空白,例如從加密硬碟中提取數據。使用 CBC,如果您在序列中失去了幾個塊,加密就變得不可能了。然而,CBC 有一個缺點——ECB 自然支持並行操作,因為每個塊都可以獨立於下一個塊進行加密。但是,對於 CBC,這更難,因為您必須在每個塊上等待。(不過,您仍然可以並行化解密。)
在某些情況下,CBC 本身也可能被認為是易受攻擊的,特別是使用可預測的 IV 和未經身份驗證的解密可以讓您猜測明文,如本答案中所述以及此處更詳細的說明。
IV 問題通過使用不可預測的(加密隨機的)IV 來解決。傳統上,身份驗證問題是使用消息身份驗證程式碼來解決的——但是,這些程式碼的實現並不完美。已經發明了專用模式來解決身份驗證問題,例如EAX和Galois Counter Mode。
存在其他模式來處理特定場景,例如:
- Counter Mode使用 ECB 模式下的分組密碼輸出應該與隨機無法區分的事實,並且 XOR 是將 counter+iv 組合加密為流密碼的結果。
- XTS是一種用於磁碟加密的操作模式。
要帶走的關鍵點是,每種模式都有許多優點和實施問題,必須仔細權衡(並正確實施)。並且,在可能的情況下,避免歐洲央行。
對駐留屬性如何通過 ECB 傳播到密文的擴展解釋
在寫這個答案時,我試圖不發布典型的 ECB 加密的 linux penguin 的圖片,但我被要求擴展“明文中的駐留屬性”,所以接下來的想法是相同的,只是以文本形式. 如果您不需要它,請隨意跳過。
首先,讓我們使用一種我知道的格式 - mp3 幀。像大多數明文一樣,這遠非“與隨機無法區分”——實際上,例如,MP3 幀頭以 11 位設置為 1 開始。
分組密碼有兩個重要的特性:
- 在塊級別上,操作是確定性的。如果我加密“加密堆棧交換”並且這適合單個塊,我希望每次都能為給定參數獲得相同的輸出。這聽起來像是一個瘋狂的標準(當然我們需要這個),但值得強調。
- 在塊級別上,輸出與隨機無法區分 - 更正式地說,攻擊者沒有使用隨機排列的優勢,至少以一種實際可計算的方式。我的術語可能有點偏離,因為我是自學成才的,但我相信如果優勢不為零,你就有偏見,這使得密碼成為線性密碼分析的候選者。
這些陳述僅適用於單個塊;但顯然在現實世界中我們想要的不止這些——我們想要加密多個塊。
假設我們生活在一個虛構的世界中,人們認為塊大小為一個字節的塊密碼是一個好主意。現在讓我們想像一下,這是一個非常好的分組密碼。現在想像一下,你有一些 Justin Bieber 音樂的 MP3,你非常希望 NSA 不要發現這件事。因此,您使用分組密碼並加密您的 MP3。
現在,其中一個塊,對文件對齊做出一些假設,將是
0xFF
- 這是 MP3 幀頭中的 11 個塊中的 8 個。這些總是在每一幀的開頭。現在我們的密碼與隨機密碼無法區分,所以我們得到了完全隨機的密文,比如說0x1c
。但它也是確定性的,我們使用的是 ECB,所以每個幀頭都0xFF
變成0x1c
.突然間,我們向攻擊者洩露了資訊——特別是如果他們懷疑這是 MP3,他們可以推斷出幀頭的位置。密碼分析有時是關於正確猜測,在這種情況下,正確的猜測會讓他們了解音頻樣本的確切長度,並讓他們辨識格式。
此外,每個其他密文塊
0x1c
現在也可以解碼。這不是我們打算透露的資訊,但我們做到了。當您考慮到我們加密的大部分內容具有嚴格的數據格式時,這個問題很常見。您必須對塊的對齊做出一些假設,但是數據越大,這個問題就越明顯。
這就是我所說的殘余明文屬性在密文中變得明顯的意思。這些是明文中固有的和想要的結構,無意中暴露給了攻擊者。
CBC模式的最初目的是作為一種辨識損壞消息的形式,本文討論了為此目的的CBC的安全性。我在論文中找不到這個想法的原始實現,但你也許能找到它。當然,我讀過的大多數關於分組密碼的書籍都提到了它和其他問題。