转载自 https://www.jianshu.com/p/16e1cbc0b7a9
填充模式不仅仅适用于对称密码,非对称密码也会用到,比如RSA
分组密码中,需要将明文按指定大小进行分组,由于明文并非指定大小的整数倍,因此在明文的最后一个分组需要将其填充至加密算法所要求的分组大小后进行加密。
在解密时,按照同样的填充模式将填充的数据去除。
斜体表示 SunJCE 支持,非斜体为 BouncyCastle 支持
NOPADDING
不填充,在此填充下原始数据必须是分组大小的整数倍,非整数倍时无法使用该模式
PKCS5PADDING,PKCS7PADDING
填充至符合块大小的整数倍,填充值为填充数量数
- 原始:
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
PKCS5PADDING
的块大小应为 8 个字节,而 PKCS7PADDING
的块大小可以在 1~255 的范围内。但 SunJCE 的 Provider 实现中 PKCS5PADDING
也按 PKCS7PADDING
来进行处理了。
ISO10126PADDING
填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节随机处理
- 原始:
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
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
ZEROBYTEPADDING
填充至符合块大小的整数倍,填充值为 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
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
TBCPADDING(Trailing-Bit-Compliment)
填充至符合块大小的整数倍,原文最后一位为“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
PKCS1PADDING
该填充模式是 RSA 加密中使用的,详见 RFC 2313。RSA 加密时,需要将原文填充至密钥大小,填充的格式为:
00 + BT + PS + 00 + D
00
为固定字节BT
为处理模式。公钥操作时为02
,私钥操作为00
或01
PS
为填充字节,填充数量为k - 3 - D
,k
表示密钥长度,D
表示原文长度。PS
的最小长度为 8 个字节。填充的值根据BT
值不同而不同:BT = 00
时,填充全00
BT = 01
时,填充全FF
BT = 02
时,随机填充,但不能为00