土薯工具 Toolshu.com 登录 用户注册

AES加密模式详解:CBC、ECB、CTR、CFB、OFB 怎么选?

原创 作者:bhnw 于 2026-04-05 10:35 发布 12次浏览 收藏 (0)

为什么选对加密模式比选对算法更重要

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 模式。

处理流数据 / 实时加密CFBCTR

高误码率信道OFB

任何情况都不要用 ECB


关于 IV 和 Nonce 的通用原则

无论选择哪种模式(ECB除外),有几条铁律:

  1. IV/Nonce 每次加密必须随机生成,不能重复使用(尤其是 OFB 和 CTR 模式)
  2. IV 不需要保密,但必须随密文一起传输(通常拼在密文头部)
  3. 密钥才是真正需要保密的,泄露密钥等于泄露所有加密数据
  4. 不要用固定字符串或时间戳作为 IV,应使用密码学安全的随机数生成器(CSPRNG)

在线工具实践

如果你想直接验证本文的各种模式,可以使用 toolshu.com 提供的 AES 在线加解密工具。工具支持 CBC、ECB、CFB、CTR、OFB 五种模式,以及 Base64/Hex 两种输出格式,所有运算均在浏览器本地完成,不上传任何数据,可以放心用于测试和验证。

发现周边 发现周边
评论区

加载中...