aes-encryption.com
简体中文

AES · GCM / CBC / CTR

AES 填充:PKCS7、GCM 与 CTR

了解 CBC 的 PKCS7 填充、GCM/CTR 为什么不需要它,以及填充报错为何不是认证结果。

填充属于模式的消息处理规则

AES 分组大小为 16 字节。CBC 需要完整分组,本工具采用 PKCS7;GCM 与 CTR 不需要 PKCS7 就能处理最后的不完整分组。不要因为其他库的界面有填充选项,就在所有模式上增加填充。

密码模式固定 GCM,没有 PKCS7。原始 CBC 明确使用 PKCS7;目标如果使用零填充或不填充,并不会自动与本工具兼容。

字节级例子

13 字节消息的 PKCS7 会追加三个值为 03 的字节,形成 16 字节分组。如果原文已正好 16 字节,则追加整组十六个十六进制 10 字节值,使去除填充有明确定义。

原始 CBC 输入 abc 为三个 UTF-8 字节,会在加密前自动追加十三个 0d。正确解密并移除 PKCS7 后恢复原来的三个字节。不要在编辑器里手动再加一遍填充。

报错能说明什么

错误密钥、IV、模式、密文变化和不同填充约定都可能报错;错误不会指出唯一原因。错误密钥得到的随机字节也偶尔可能碰巧符合填充,所以移除成功不等于明文通过认证。

GCM 的失败是认证不匹配,不释放明文。不要把损坏的 GCM 包切换到 CBC 来绕过保护。CTR 没有填充校验,可能直接返回字节,同样不能证明完整性。

不要靠删改原文排错

确认密文解码正确、CBC IV 为 16 字节、密钥长度与选项一致,并保留原消息所需的尾部换行。如果对方使用另一填充约定,应使用对应实现,不要自行删零或猜测该丢弃多少明文。

相关工具与阅读

技术参考

更新于 2026 年 10 月 16 日

常见问题

16 字节原文为什么多出一个 CBC 分组?

PKCS7 在原文已对齐时会追加完整的 16 字节填充分组,这是正常规则,并非重复明文。

CBC 填充成功能证明密钥正确吗?

不能。填充是格式检查,不是消息认证;还需适当的认证协议和可信上下文。