AES 加密:模式与填充方式 完整详解

AES(高级加密标准)是对称分组加密算法,它只能固定处理 16 字节(128 位) 长度的数据块,因此需要加密模式处理长数据,填充方式处理不足 16 字节的末尾数据,这是 AES 使用的两个核心配置。


一、AES 加密模式(工作模式)

加密模式决定如何将多个 16 字节数据块串联加密,分为电码本模式、密码块链接、计数器模式三大类,安全性和用途差异极大。

1. ECB 电子密码本(最不安全,禁用)

  • 原理:每个 16 字节块独立加密,相同明文 → 相同密文

  • 缺点:暴露数据规律,极易被破解,绝对不能用

  • 场景:无任何生产场景

2. CBC 密码块链接(经典安全)

  • 原理:当前块加密前,先和上一个块的密文做异或

  • 必须:需要 IV 初始向量(16 字节随机值,和密文一起传输)

  • 优点:相同明文会生成不同密文,安全性高

  • 缺点:无法并行加密,速度一般

  • 场景:文件加密、通用数据加密

3. CFB / OFB 密码反馈 / 输出反馈

  • 流式加密,可处理任意长度数据

  • 实际开发中很少使用,被 CTR 取代

4. CTR 计数器模式(推荐,高性能)

  • 原理:用计数器生成密钥流,与明文异或

  • 优点并行加密、速度极快、无填充问题

  • 必须:需要 IV/Nonce(随机数)

  • 场景:高速传输、大数据加密

5. GCM 伽罗瓦 / 计数器模式(现代首选,最安全)

  • 原理:CTR 模式 + 认证加密

  • 优点

    • 速度极快

    • 自带完整性校验(能判断数据是否被篡改)

    • 安全性最高

  • 必须:IV + 生成的标签(Tag)

  • 场景:HTTPS (TLS)、VPN、API 接口加密、现代所有安全通信


二、AES 填充方式

AES 只能处理16 字节整数倍的数据,不足 16 字节的部分必须填充,流式模式(CTR/GCM)不需要填充

1. PKCS7Padding(最常用、标准)

  • 缺 n 个字节,就填充 n 个 0x0n

  • 例:缺 5 字节 → 填充 05 05 05 05 05

  • 所有语言默认、兼容性最好

2. PKCS5Padding

  • 本质是 PKCS7 的子集,仅针对 8 字节块

  • AES 是 16 字节块,用 PKCS7 即可,两者通用

3. ZeroPadding 零填充

  • 不足部分补 00

  • 缺点:如果明文末尾是 0,解密后无法区分,会丢失数据

  • 不推荐

4. ISO10126

  • 最后一个字节是填充长度,其余随机

  • 已淘汰


三、开发中最实用的组合(直接照抄)

✅ 安全等级最高(推荐)

AES-GCM + 无填充

  • 速度快、防篡改、现代标准

  • HTTPS / 微信支付 / 支付宝 / 接口加密 都用这个

✅ 经典通用组合

AES-CBC + PKCS7Padding

  • 兼容性最好、老系统 / 文件加密常用

  • 必须使用随机 IV

❌ 绝对禁止

AES-ECB + 任意填充


四、核心知识点速记

  1. 块大小固定:AES 永远是 16 字节(128 位)

  2. IV 必须随机:CBC/GCM/CTR 必须用随机 16 字节 IV,不能写死

  3. GCM 自带校验:比 CBC 更安全,还能防篡改

  4. 填充只针对分组模式:CBC/ECB 需要填充,GCM/CTR 不需要

  5. 密钥长度:128/192/256 位(16/24/32 字节)


总结

  1. 首选加密模式AES-GCM(安全 + 速度 + 防篡改)

  2. 首选填充方式PKCS7Padding(通用标准)

  3. 必须记住:GCM/CTR 不需要填充,CBC 需要填充,ECB 禁用

  4. 开发标配:随机 IV + 安全模式 + 标准填充

posted @ 2026-04-15 11:09  心猿益码  阅读(350)  评论(0)    收藏  举报