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 + 任意填充
四、核心知识点速记
-
块大小固定:AES 永远是 16 字节(128 位)
-
IV 必须随机:CBC/GCM/CTR 必须用随机 16 字节 IV,不能写死
-
GCM 自带校验:比 CBC 更安全,还能防篡改
-
填充只针对分组模式:CBC/ECB 需要填充,GCM/CTR 不需要
-
密钥长度:128/192/256 位(16/24/32 字节)
总结
-
首选加密模式:AES-GCM(安全 + 速度 + 防篡改)
-
首选填充方式:PKCS7Padding(通用标准)
-
必须记住:GCM/CTR 不需要填充,CBC 需要填充,ECB 禁用
-
开发标配:随机 IV + 安全模式 + 标准填充

浙公网安备 33010602011771号