Block-Cipher
如何確定 CBC 中的消息是否有填充?
當一個程序在解密一條通過CBC模式加密的消息時,它會發現什麼,最後一個塊的最後一個字節是填充的一部分還是明文的一部分?
範例:使用 4 字節塊大小的 CBC 模式並加密以下兩條消息:
m1 = ABCDEF m2 = ABCDEF22
M1 得到填充,將是“ABCDEF22”。我如何找出原始明文是 ABCDEF 還是 ABCDEF22?
實際上,這取決於應用的填充。也許根本沒有填充。該實現定義了應用的填充。檢查程式碼或文件!
最後
22
一個 最初表示可能是PKCS#5或PKCS#7,因為 PKCS#7 在 CBC 實現中最常見。雖然 PKCS#5 像 DES 一樣被限制為 8 個字節,但 PKCS#7 工作在 1 到 256 個字節之間。PKCS#7 附加八位字節,如對於此類算法,方法應是在尾端填充輸入 $ k - (l \bmod k) $ 八位字節都有價值 $ k - (l \bmod k) $ , 在哪裡 $ l $ 是輸入的長度。
然而,那是
0x02,0x02
。最後一個中的2
s是 hex22
中的字元。2``0x32
要查看具有 PKCS#7 填充,請檢查最後一個八位字節並確保該值 $ k $ 最後一個八位組重複 $ k $ 次。16 字節分組密碼的範例,其中每個位置都是一個字節。1 表示
0x01
,2 表示0x02
,以此類推。xxxxxxxxxxxxxxx1 xxxxxxxxxxxxxx22 xxxxxxxxxxxxx333 ... xFFFFFFFFFFFFFFF xxxxxxxxxxxxxxxx full block append a new block that contains 16 times 0x10
要查看其他填充候選,請參閱Wikipedia 中的填充