Block-Cipher

如何確定 CBC 中的消息是否有填充?

  • February 9, 2021

當一個程序在解密一條通過CBC模式加密的消息時,它會發現什麼,最後一個塊的最後一個字節是填充的一部分還是明文的一部分?

範例:使用 4 字節塊大小的 CBC 模式並加密以下兩條消息:

m1 = ABCDEF
m2 = ABCDEF22

M1 得到填充,將是“ABCDEF22”。我如何找出原始明文是 ABCDEF 還是 ABCDEF22?

實際上,這取決於應用的填充。也許根本沒有填充。該實現定義了應用的填充。檢查程式碼或文件!

最後22一個 最初表示可能是PKCS#5PKCS#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。最後一個中的2s是 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 中的填充

引用自:https://crypto.stackexchange.com/questions/78187