PKCS#5 填充和 PKCS#7 填充有什麼區別
一個執行時平台提供了一個 API,它為 ECB 和 CBC 等分組密碼模式提供 PKCS#5 填充。這些模式已為三重 DES、AES 和 Blowfish 分組密碼定義。其他平台 API 僅提供 PKCS#7 填充。
PKCS#5 填充和 PKCS#7 填充是否兼容?
PKCS#5 和 PKCS#7填充機制之間的區別在於塊大小;PKCS#5 填充是為 8 字節塊大小定義的,PKCS#7 填充適用於從 1 到 255 字節的任何塊大小。
這是 RFC 中定義的PKCS#5填充 (6.2) 的定義:
填充字元串 PS 應由 8 - (||M|| mod 8) 八位字節組成,所有字節的值都為 8 - (||M|| mod 8)。
包含PKCS#7標準的 RFC 是相同的,只是它允許塊大小最大為 255 字節(10.3 注 2):
對於這樣的算法,方法應該是在輸入的尾端用 k - (l mod k) 個八位字節填充所有的值 k - (l mod k),其中 l 是輸入的長度。
所以從根本上說,PKCS#5 填充是 8 字節塊大小的 PKCS#7 填充的子集。因此,PKCS#5 填充不能用於 AES。PKCS#5 填充僅在考慮 RC2/RC5 和(三重)DES 操作的情況下定義。
許多密碼庫使用指示 PKCS#5 或 PKCS#7 的標識符來定義相同的填充機制。如果在計算中使用的塊大小不是 8,則標識符*應指示 PKCS#7。*一些加密庫(例如Java 中的 SUN 提供程序)指示應該使用 PKCS#5 的 PKCS#5 -
"PKCS5Padding"
應該是 PKCS#7"PKCS7Padding"
。這很可能是從只有 8 字節塊密碼(例如(三重)DES 對稱密碼)可用時的遺留物。請注意,PKCS#5 和 PKCS#7 都不是為描述填充機製而創建的標準。填充部分只是定義功能的一小部分。PKCS#5 是基於密碼的加密或 PBE 的標準,而 PKCS#7 定義了加密消息語法或 CMS。從這個意義上說,您可以說 ECB 和 CBC 模式可以使用PKCS#5 或 PKCS#7 兼容的填充。後來的 PKCS#5 標準只是指 PKCS#7 CMS 標準的後續版本,用於 16 字節分組密碼,例如 AES。