爲什麼選對加密模式比選對算法更重要
AES 本身是一種分組密碼:每次只能加密固定長度(128位)的數據塊。當你需要加密任意長度的數據時,就必須決定如何把這些數據塊"串"起來——這就是加密模式(Mode of Operation)要解決的問題。
同樣是 AES-256,用錯了模式,安全性可能會一落千丈。2013年 Adobe 數據泄露事件中,密碼庫的加密方式正是用了最不安全的 ECB 模式,導致攻擊者即便拿不到密鑰,也能通過密文的規律性直接推斷出哪些用戶使用了相同的密碼。
本文對比 AES 最常見的五種模式:ECB、CBC、CFB、OFB、CTR,幫你在實際項目中做出正確選擇。
五種模式快速對比
| 模式 | 並行加密 | 並行解密 | 需要IV | 流式處理 | 安全性 |
|---|---|---|---|---|---|
| ECB | ✅ | ✅ | ❌ | ❌ | ⚠️ 弱 |
| CBC | ❌ | ✅ | ✅ | ❌ | ✅ 強 |
| CFB | ❌ | ✅ | ✅ | ✅ | ✅ 強 |
| OFB | ❌ | ❌ | ✅ | ✅ | ✅ 強 |
| CTR | ✅ | ✅ | ✅* | ✅ | ✅ 強 |
*CTR 模式使用 Nonce(數字只用一次)代替傳統 IV,本質相同。
ECB:最簡單,也最危險
ECB(Electronic Codebook,電子密碼本)是最樸素的實現:把明文切成等長的塊,每塊獨立加密。
致命缺陷:相同的明文塊,始終產生相同的密文塊。
這意味着密文中保留了原始數據的結構信息。經典的演示案例是用 ECB 模式加密一張 Linux 企鵝圖片——加密後的圖片依然能清晰辨認出企鵝的輪廓,因爲顏色相同的像素塊加密結果完全一樣。
明文塊A → 密文塊X
明文塊A → 密文塊X ← 完全相同!攻擊者可以據此推斷規律
明文塊B → 密文塊Y
結論:ECB 不應該在任何實際場景中使用。 它存在於工具裏,只是爲了兼容極少數遺留系統。
CBC:最廣泛,最經典
CBC(Cipher Block Chaining,密碼塊鏈接)是目前使用最廣泛的模式。它的核心思路是:加密每個塊之前,先把它與上一個密文塊做 XOR 運算,再進行加密。第一個塊沒有前驅,所以需要一個初始化向量(IV)。
明文塊1 XOR IV → 加密 → 密文塊1
明文塊2 XOR 密文塊1 → 加密 → 密文塊2
明文塊3 XOR 密文塊2 → 加密 → 密文塊3
優點:
- 相同明文塊因 XOR 鏈式操作,產生完全不同的密文
- 密文無規律性,安全性高
- 廣泛兼容,OpenSSL、各語言加密庫均默認支持
缺點:
- 加密過程無法並行(每塊依賴上一塊的結果)
- 解密可以並行
- 需要正確處理 Padding(填充),Padding Oracle 攻擊是其主要威脅
適用場景: 文件加密、數據庫字段加密、API 報文加密。與 OpenSSL enc 命令交互時,默認也是 CBC 模式。
💡 使用 toolshu.com 的 AES 在線加解密工具,可以直接體驗 CBC 模式的"Passphrase 模式",它與
openssl enc -aes-256-cbc命令完全兼容。
CFB:流式加密,適合實時數據
CFB(Cipher Feedback,密碼反饋)把塊密碼轉變成流密碼的工作方式。它不直接加密明文塊,而是先加密上一個密文塊(或 IV),再把結果與明文塊 XOR。
加密(IV) XOR 明文塊1 → 密文塊1
加密(密文塊1) XOR 明文塊2 → 密文塊2
優點:
- 無需對明文進行填充
- 支持以小於塊大小的單位(如字節)進行加密,適合流式場景
- 解密可以並行
缺點: 加密不能並行,且一個密文塊損壞會影響後續兩個塊的解密。
適用場景: 流媒體傳輸、串行數據加密、需要實時處理的場景。
OFB:容錯性強,離線流密碼
OFB(Output Feedback,輸出反饋)與 CFB 很像,但有一個關鍵區別:反饋的是加密函數的輸出,而不是密文塊。這意味着密鑰流可以完全獨立於明文/密文提前生成。
KeyStream1 = 加密(IV)
KeyStream2 = 加密(KeyStream1)
KeyStream3 = 加密(KeyStream2)
密文塊1 = 明文塊1 XOR KeyStream1
密文塊2 = 明文塊2 XOR KeyStream2
優點:
- 密文塊損壞不會傳播錯誤——損壞的位隻影響對應位,不影響後續塊
- 可以提前預計算密鑰流
缺點:
- 加密和解密都不能並行
- 絕對不能對同一個 IV 加密兩段不同的明文(否則密鑰流複用,安全性崩潰)
適用場景: 衛星通信等高誤碼率信道,容忍少量比特翻轉但不能讓錯誤擴散的場景。
CTR:性能最佳,現代首選
CTR(Counter,計數器)模式是現代系統中最推薦的模式之一。它通過加密一個不斷遞增的計數器來生成密鑰流,再與明文 XOR。
密鑰流塊1 = 加密(Nonce || Counter=1)
密鑰流塊2 = 加密(Nonce || Counter=2)
密鑰流塊3 = 加密(Nonce || Counter=3)
密文塊N = 明文塊N XOR 密鑰流塊N
優點:
- 加密和解密都可以完全並行,性能極高
- 無需 Padding
- 可以隨機訪問密文的任意塊,無需從頭開始
- 天然適合多核處理器和 GPU 加速
缺點:
- Nonce 絕對不能重複使用。同一密鑰下重複 Nonce 會直接泄露明文(XOR 密鑰流複用攻擊)。
適用場景: 高性能系統(數據庫全盤加密、TLS 協議中與 GCM 結合使用)。AES-GCM(CTR模式加認證碼)是目前 HTTPS/TLS 1.3 的主流選擇。
實際選擇建議
新項目,通用場景 → 優先考慮 AES-GCM(CTR + 認證),它同時提供加密和完整性驗證。如果你的加密庫支持,這是首選。
需要與 OpenSSL 命令行兼容 → 使用 CBC + PKCS7 填充,配合 Passphrase 模式。
處理流數據 / 實時加密 → CFB 或 CTR。
高誤碼率信道 → OFB。
任何情況都不要用 ECB。
關於 IV 和 Nonce 的通用原則
無論選擇哪種模式(ECB除外),有幾條鐵律:
- IV/Nonce 每次加密必須隨機生成,不能重複使用(尤其是 OFB 和 CTR 模式)
- IV 不需要保密,但必須隨密文一起傳輸(通常拼在密文頭部)
- 密鑰纔是真正需要保密的,泄露密鑰等於泄露所有加密數據
- 不要用固定字符串或時間戳作爲 IV,應使用密碼學安全的隨機數生成器(CSPRNG)
在線工具實踐
如果你想直接驗證本文的各種模式,可以使用 toolshu.com 提供的 AES 在線加解密工具。工具支持 CBC、ECB、CFB、CTR、OFB 五種模式,以及 Base64/Hex 兩種輸出格式,所有運算均在瀏覽器本地完成,不上傳任何數據,可以放心用於測試和驗證。



加載中...