Block-Cipher

AES-CBC 密文中的塊可以以這樣的方式被操縱,即明文被打亂嗎?

  • April 29, 2019

假設我們有 N 個 16 字節的明文塊序列,使用 AES 在 CBC 模式下加密,並帶有一個 IV,從而產生 N+1 個 16 字節的密文塊。能否以這樣一種方式操縱這個密文,即一旦解密,純文字就會被打亂(即它的 N 個塊中的一些被重新排序),但沒有其他修改?

由於每個塊都依賴於前一個塊,如果我們只是打亂密文塊,一些生成的明文塊可能會重新排序,但代價是其他塊被完全改變。還可以刪除一些 M 首個密文塊,這會使 M 首個明文塊也消失,但我認為沒有辦法將這些密文塊附加到消息的末尾以正確解密。是否存在其他一些密文操作,一旦解密就會導致明文塊重新排序,但沒有其他更改?

這似乎是不可能的。考慮使用 AES-CBC 和密鑰對 2 塊(32 字節)明文消息進行加密的簡單情況 $ k $ 和初始化向量 $ IV $ . 讓明文塊被引用為 $ P_1 $ 和 $ P_2 $ ,並讓對應的密文塊被引用為 $ C_1 $ 和 $ C_2 $ . 在這種情況下,知道 $ \text{AES.encrypt}(k, P_1 || P_2) = C_1 || C_2 $ 然後 $ \text{AES.decrypt}(k, C_1 || C_2) = P_1 || P_2 $ , 你試圖找出是否 $ \text{AES.decrypt}(k, f(C_1) || f(C_2)) $ 可能等於 $ P_2 || P_1 $ , 在哪裡 $ f $ 是應用於密文的一些操作函式。

從正常的CBC解密 $ (C_1 || C_2) $ 進入 $ (P_1 || P_2) $ ,我們保證以下關係:

$ \text{AES.decrypt}(k, C_2) \oplus C_1 = P_2 $

$ \text{AES.decrypt}(k, C_1) \oplus IV = P_1 $

為了 $ (f(C_1) || f(C_2)) $ 解密成 $ (P_2 || P_1) $ ,以下關係必須為真:

$ \text{AES.decrypt}(k, f(C_2)) \oplus f(C_1) = P1 $

$ \text{AES.decrypt}(k, f(C_1)) \oplus IV = P_2 $

然後,通過替換,以下內容也必須為真:

$ \text{AES.decrypt}(k, f(C_2)) \oplus f(C_1) = \text{AES.decrypt}(k, C_1) \oplus IV $

$ \text{AES.decrypt}(k, f(C_1)) \oplus IV = \text{AES.decrypt}(k, C_2) \oplus C_1 $

為了使第一個等式成立, $ f(C_2) $ 必須相等 $ C_1 $ 和 $ f(C_1) $ 必須相等 $ IV $ ,並且為了使第二個也是正確的, $ f(C_1) $ 必須相等 $ C_2 $ 和 $ IV $ 必須相等 $ C_1 $ ,給我們以下資訊:

$ f(C_2) = C_1 $

$ f(C_1) = C_2 $

$ f(C_1) = IV $

$ C_1 = IV $

$ f(C_1) = C_1 \rightarrow C_1 = C_2 $

因此,您可以操作 32 字節 AES-CBC 輸出中的塊以解密為重新排列的原始明文塊的唯一方法是,如果輸出塊 $ C_1 $ 和 $ C_2 $ 是相同的。顯然,如果是這種情況,相應的輸入塊也將是相同的,惡意行為者一開始就沒有必要重新排列它們。

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