AES-ECB 是什么
ECB(Electronic Codebook,电码本模式)是最简单的分组工作模式:每个 16 字节明文块各自独立加密,相同明文块必然产生相同密文块,不需要 IV。它因此会泄漏数据结构的重复模式——经典演示是加密位图后仍能看出轮廓。ECB 不是算法缺陷而是模式特性,换成 256 位密钥也不会改善。
基本信息
| 标准 | NIST SP 800-38A |
|---|---|
| IV | 无 |
| 填充 | 仍需 PKCS#7 补齐块边界 |
| 主要问题 | 确定性加密、相同明文块产生相同密文块 |
| 影响 | 泄漏明文结构、支持重排与替换攻击 |
| 替代方案 | GCM(需认证)、CBC + HMAC、CTR + MAC |
| 少数可用例外 | 单个短块(如加密一把数据密钥)、明确要求确定性且无重复结构的场景 |
典型使用场景
- 识别与整改:审计代码时先找出 ecb 用法,判断是否泄漏数据结构
- 教学演示:用重复块展示模式泄漏的原理,理解 IV 与链接结构的作用
- 兼容老格式:个别历史文件格式固定使用 ECB,只读场景需要能解开
- 密钥封装:对单块随机数据(如一把数据密钥)做 ECB 时结构重复风险有限,但仍不如 AEAD 直接
- 渗透与合规复核:扫描工具把 ECB 列为弱模式时,据此判定风险等级与整改优先级
复现相同块问题
复现相同块问题
# 构造两段完全相同的 16 字节明文,观察 ECB 下密文是否也相同
printf 'ABCDEFGHABCDEFGHABCDEFGHABCDEFGH' > blocks.txt
# 使用 FIPS 197 附录 C 的 AES-256 示例向量密钥,便于核对实现
openssl enc -aes-256-ecb -nosalt -K 603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4 -in blocks.txt -out out.bin
# 输出前 16 字节与后 16 字节完全相同,说明模式泄漏已发生
xxd -p out.bin风险与对策
| 风险 | 表现 | 对策 |
|---|---|---|
| 模式泄漏 | 相同明文块密文相同,结构可见 | 改用 GCM 或 CBC+HMAC |
| 块替换攻击 | 可重排或替换密文块而解密不报错 | 引入完整性校验(AEAD 或 HMAC) |
| 确定性加密 | 可判断两段密文是否对应相同明文 | 使用随机 IV 的链接模式或 AEAD |
| 密钥长度错觉 | 认为换 256 位即可解决 | 模式问题与密钥长度无关,必须换模式 |
| 填充边界 | 误用 -nopad 导致解密长度不符 | 明确填充约定并保持两端一致 |
ECB 无法隐藏明文模式,任何包含重复结构的数据(姓名列表、日志、结构化报文、图片)都会泄漏信息。新系统不要选用 ECB;存量系统中发现 ECB 时应按风险排期整改为 GCM 或 CBC + HMAC。
ECB 不需要 IV 但仍然需要填充:明文长度不是 16 字节整数倍时要用 PKCS#7 补齐。有些实现提供无填充选项(如 -nopad),调用方需自行保证长度对齐,否则解密结果会少一块或报长度错误。