说明
- 对称加解密算法是分组运算,运算时需要将数据按固定长度分组,由于明文不一定是指定大小的整数倍,因此需要将明文的最后一个分组填充至加密算法所要求的分组大小后进行运算。
- 随着加解密算法的发展,出现了多种填充规则。
- 填充规则是对称加密分组加密算法的通用机制,一种算法可能支持多种填充规则,例如:AES算法。
填充规则
PKCS5/PKCS5Padding
- 将原始数据长度(字节数)填充到8的倍数,填充字节数据是 8 - (x % 8),x是原始数据长度。
原始数据:FF FF FF FF
填充后数据:FF FF FF FF 04 04 04 04
PKCS7/PKCS7Padding
- 假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。
- PKCS5以8字节为单元,而PKCS7支持1-255之间任意字节长度为单元,PKCS7是兼容PKCS5的,PKCS5是PKCS7的一个子集。
- SM4,AES等大部分算法 分组长度固定为128 Bits,因此采用的是该填充规则。
block size为16字节时:
原始数据: FF FF FF FF FF FF FF FF FF FF
填充后数据: FF FF FF FF FF FF FF FF FF FF 06 06 06 06 06 06
ZeroBytePadding/ZeroPadding
原始数据:FF FF FF FF FF FF FF FF FF
填充后数据:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00
ISO10126PADDING
- 填充至符合块大小的整数倍,填充的最后一个字节为填充的数量数,其他字节随机处理。
原始数据:FF FF FF FF FF FF FF FF FF
填充后数据:FF FF FF FF FF FF FF FF FF xx xx xx xx xx xx 07
xx 表示任意数据
ISO7816-4PADDING
- 填充至符合块大小的整数倍,填充的第一个字节为 0x80,其他字节填 0。
原始数据:FF FF FF FF FF FF FF FF FF
填充后数据:FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00 00
X923PADDING
- 填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节填 0。
原始数据:FF FF FF FF FF FF FF FF FF
填充后数据:FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07
注意
- 明文size是单组size的倍数的情况,也需要对明文进行填充。
- 目的是方便统一处理,算法处理的数据一定是填充后的。
- 避免一些特殊情况,例如明文恰好是:FF FF FF FF FF FF FF FF FF FF 06 06 06 06 06 06,
加密算法无法区分后面的6个06是明文,还是填充的数据。
- 解密时,需要根据加密时使用的填充规则,将填充数据剔除。