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,解密后读最后一字节即可知道真实长度。

相关推荐
阿萨德528号19 小时前
纯前端RSA加密解密工具:基于JSEncrypt的浏览器端数据加解密实践
笔记·密码学
如君愿19 小时前
考研复习 Day 38 | 密码学--第三章 古典密码
考研·密码学·课后习题
如君愿2 天前
考研复习 Day 37 | 密码学--第一章 绪论、第二章 相关的基础知识
考研·密码学
lularible2 天前
HSM技术精讲(1.4):当信道不再可信——密码学的诞生
安全·开源·密码学·嵌入式
其实防守也摸鱼3 天前
ctfshow--Crypto(funnyrsa1-密码2)解题步骤
python·安全·web安全·网络安全·密码学·web·工具
其实防守也摸鱼11 天前
软件安全与漏洞--软件安全设计
运维·网络·安全·网络安全·密码学·需求分析·软件安全
其实防守也摸鱼12 天前
ctfshow--Crypto(crypto1-14)解题步骤
java·开发语言·网络·安全·密码学·ctf·ctfshow
安当加密12 天前
数据库密码写配置文件?我用动态凭据管理重构了50个微服务的数据库连接
数据库·密码学·安全架构
MicroTech202512 天前
微算法科技(NASDAQ :MLGO)基于后量子密码学的动态BFT共识机制:QDBFT架构
科技·算法·密码学
Chen--Xing13 天前
NSSCTF -- [tangcuxiaojkuai] -- easy_factor
ctf·writeup·nssctf·crypto