分組密碼中,需要將明文按指定大小進行分組,由於明文並非指定大小的整數倍,因此在明文的最後一個分組需要將其填充至加密算法所要求的分組大小後進行加密。
在解密時,按照同樣的填充模式將填充的數據去除。
斜體表示 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