PKCS#7填充

PKCS#7 填充(PKCS#7 Padding)是分组密码中最常用的一种字节填充方式 ,目的是把任意长度 的明文补齐到分组大小的整数倍 (通常 8 或 16 字节)。

核心规则一句话:

每个填充字节的值 = 需要填充的字节数


一、算法步骤(以 16-byte 分组为例)

  1. 计算缺多少字节:
    padLen = blockSize - (dataLen % blockSize)
    若数据刚好整除,则额外补一整组(16 字节)。
  2. 在尾部追加 padLen 个字节,每个字节值都是 padLen(1~16)。
  3. 解密后,读取最后一个字节的数值即可知道真实数据长度,把填充剪掉即可。

二、实例

原始数据 缺字节 填充后(HEX)
01 02 03 04 05(5 B) 11 01 02 03 04 05 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B
00 01 ... 0F(16 B) 16 00 01 ... 0F 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

三、与其他填充区别

  • PKCS#5 填充:只定义 8-byte 分组,算法与 PKCS#7 完全一致;后来 PKCS#7 把块大小推广到 1~255,因此**>8 字节分组时叫 PKCS#7**。
  • ZeroPadding:全补 0x00,无法区分原始末尾 0 还是填充。
  • ISO10126:填充字节除最后一个外随机,最后一字节为长度(已淘汰)。
  • ANSI X.923:填充字节全 0,最后一字节为长度。

四、代码片段(Java,AES-128-CBC)

java 复制代码
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 块大小 16,即 PKCS#7
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] out = cipher.doFinal(plain);

五、常见陷阱

  1. 解密后一定要去掉填充 ,否则末尾会多出一串 0x0n
  2. 填充本身不抗篡改,需配合 MAC(如 HMAC)或 AEAD(如 GCM)。
  3. 块大小只能是 1~255;AES 固定 16 字节,3DES 固定 8 字节。

一句话记住

PKCS#7 填充 = 缺 N 字节就补 N 个 0xN,解密后读最后一字节即可知道真实长度。

相关推荐
酿情师1 天前
2026软件系统安全赛初赛RSA(赛后复盘)
android·网络·安全·密码学·rsa
Liudef061 天前
后量子密码学(PQC)深度解析:算法原理、标准进展与软件开发行业的影响
算法·密码学·量子计算
YIN_尹4 天前
关于论文《使用 FLUSH+RELOAD 缓存侧信道攻击恢复 OpenSSL ECDSA 的随机数》的理解
缓存·系统安全·密码学
MicroTech20259 天前
基于后量子密码学:微算法科技(NASDAQ: MLGO)区块链预言机加密可更新方案
科技·区块链·密码学
道法自然|~10 天前
BugCTF黄道十二宫
算法·密码学
温中志11 天前
计算机密码学基础
密码学
Jianghong Jian17 天前
Hashcat:强大的密码恢复与安全测试工具
测试工具·安全·密码学
WHD30617 天前
企业数据安全体系建设指南:从风险识别到技术落地的全流程(2026版)
大数据·网络·人工智能·安全·系统架构·密码学·安全架构
Y5neKO17 天前
某国赛CTF密码学题目Writeup:RSA
密码学·ctf·rsa
老星*19 天前
Vaultwarden:开源轻量的1Password替代,自托管密码管理方案
开源·github·密码学