首页/安全/加密与证书速查/AES-ECB 电码本模式(不建议使用)
加密算法基础95 条

AES-ECB 电码本模式(不建议使用)

最简单的分组模式:每块独立加密,相同明文块产生相同密文块,会泄漏数据结构(经典演示为位图轮廓可见),新系统一般不应选用。

加密与证书速查安全更新于 2026-10-13

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),调用方需自行保证长度对齐,否则解密结果会少一块或报长度错误。

易错点

  • 用 ECB 加密结构化数据:姓名、编号、状态字段的重复值会直接暴露,等于把明文结构写进密文
  • 以为换更长的密钥能解决问题:ECB 的问题是模式固有性质,与密钥长度无关
  • 只改用 CBC 就收工:CBC 同样没有完整性保护,仍可被翻位篡改,需要 AEAD 或加密后追加 MAC
  • 混用填充与无填充模式:一端按 PKCS#7 补齐、另一端按无填充解密,必然出现长度不符
  • 在代码里把 ECB 作为默认选项:默认值一旦定错,后续所有调用都会继承同一个结构性缺陷

数据来源与参考

  • NIST SP 800-38A(ECB 模式)
  • FIPS 197 附录 C(AES-256 示例向量)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌