为什么选对加密模式比选对算法更重要
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 两种输出格式,所有运算均在浏览器本地完成,不上传任何数据,可以放心用于测试和验证。



加载中...