本文所述填充模式可适用于 DES、AES 等分组密码算法中
分组密码算法中需要将明文按指定大小进行分组,由于明文并非指定大小的整数倍,因此在明文的最后一个分组需要将其填充至加密算法所要求的分组大小后进行加密。
常见的填充模式有:
不填充,在此填充下原始数据必须是分组大小的整数倍,非整数倍时无法使用该模式。
填充至符合块大小的整数倍,填充值为填充数量数。
假设每个区块大小为 blockSize:
PKCS7PADDING 的块大小可以为 1~255 中任意值, PKCS5PADDING 是 PKCS7PADDING 的子集,块大小只能为固定值 8 。在标准 AES 算法中,块大小本身就为固定值 8 ,所以 PKCS7PADDING 和 PKCS5PADDING 是一样的。
填充示例原始:FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
原始:FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF 08 08 08 08 08 08 08 08
原文为整数倍也需要填充
填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节随机处理。
原始:FF FF FF FF FF FF FF FF FF
填充:FF FF FF FF FF FF FF FF FF 3F 7A B4 09 14 36 07
填充至符合块大小的整数倍,填充值第一个字节为 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
填充至符合块大小的整数倍,填充值为 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 00
填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节填 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
填充至符合块大小的整数倍,原文最后一位为“1”时填充 0x00,最后一位为“0”时填充“0xFF”。
原始: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
原始:FF FF FF FF FF FF FF FF F0
填充:FF FF FF FF FF FF FF FF F0 FF FF FF FF FF FF FF
该填充模式是 RSA 加密中使用的,详见 RFC 2313。RSA 加密时,需要将原文填充至密钥大小,填充的格式为:00 + BT + PS + 00 + D
。