分組密碼中,需要將明文按指定大小進行分組,由于明文并非分組加密算法塊大小的整數(shù)倍,因此在明文的最后一個分組需要將其填充至加密算法所要求的分組大小后進行加密。
在解密時,按照同樣的填充模式將填充的數(shù)據(jù)去除。
需要注意的是,如果使用了填充算法,即使明文正好是分組加密算法的整數(shù)倍時,也需要進行填充。填充后的字節(jié)數(shù)為:
以上 為分組的塊大小。
斜體表示 SunJCE 支持,非斜體為 BouncyCastle 支持
NoPadding
不填充,在此填充下原始數(shù)據(jù)必須是分組大小的整數(shù)倍,非整數(shù)倍時無法使用該模式。比如采用 GCM 加密模式時,由于 GCM 加密模式不需要進行填充,因此需要使用該填充算法。
PKCS5Padding / PKCS7Padding
填充至符合塊大小的整數(shù)倍,填充值為填充數(shù)量數(shù)
- 原始:
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 的塊大小應(yīng)為 8 個字節(jié),而 PKCS7Padding 的塊大小可以在 1~255 的范圍內(nèi)。但 SunJCE 的 Provider 實現(xiàn)中 PKCS5Padding 也按 PKCS7Padding 來進行處理了。
ISO10126Padding
填充至符合塊大小的整數(shù)倍,填充值最后一個字節(jié)為填充的數(shù)量數(shù),其他字節(jié)隨機處理
- 原始:
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
填充至符合塊大小的整數(shù)倍,填充值第一個字節(jié)為 0x80,其他字節(jié)填 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
填充至符合塊大小的整數(shù)倍,填充值為 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
填充至符合塊大小的整數(shù)倍,填充值最后一個字節(jié)為填充的數(shù)量數(shù),其他字節(jié)填 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)
填充至符合塊大小的整數(shù)倍,原文最后一位為“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 加密中使用的,即 PKCS#1 1.5 版本,詳見 RFC 2313。RSA 加密時,需要將原文填充至密鑰大小,填充的格式為:
00 + BT + PS + 00 + D
-
00為固定字節(jié) -
BT為處理模式。公鑰操作時為02,私鑰操作為00或01 -
PS為填充字節(jié),填充數(shù)量為k - 3 - D,k表示密鑰長度,D表示原文長度。PS的最小長度為 8 個字節(jié)。填充的值根據(jù)BT值不同而不同:-
BT = 00時,填充全00 -
BT = 01時,填充全FF -
BT = 02時,隨機填充,但不能為00
-
OAEP
該填充模式是 RSA 加密中使用的,即 PKCS#1 2.2 版本,詳見 RFC 8017。OAEP 填充算法較為復(fù)雜,在 Java 中使用 RSA 公鑰加密推薦使用 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 算法。