Aes

在兩個密鑰下解密的 AES-GCM 密文

  • October 8, 2020

我們如何展示AES-GCM密文,包括 IV 和 128 位身份驗證標籤以及不同的密鑰 $ K_0 $ 和 $ K_1 $ ,這樣兩個密鑰的解密都成功了嗎?

我們對這樣解密得到的各個明文有什麼程度的控制?這是否可以擴展到相同的加密和經過身份驗證的密文解密為兩個有意義但完全不同的文件的噩夢參考頁面)(對於某些標准文件/存檔格式)?

歡迎使用數值範例(或指向該範例的連結)!


更新:有人告訴我,這與Yevgeniy Dodis Paul Grubbs、Thomas Ristenpart 和 Joanne Woodage在Crypto 2018 會議上的Fast Message Franking: From Invisible Salamanders to Encryptment中所描述的一樣;但我想要一個獨立的答案,重點是如何(即使這不是詳細的),如果這不是必需的,則忽略相關數據。

我們如何展示一個

$$ AES-GCM $$$$ 1 $$密文,包括 IV 和 128 位身份驗證標籤,以及不同的密鑰 $ K_0 $ 和 $ K_1 $ ,這樣兩個密鑰的解密都成功了嗎?

這很容易(如果你了解線性代數 $ GF(2^{128}) $

這是你要做的:

  • 您隨意選擇鍵 $ K_0 $ 和 $ K_1 $ 、nonce 和密文/AAD(除了一個塊,它可以在任何地方,包括在 AAD 中);我們假設一個塊在 indes $ i $ (其中密文的最後一個塊是索引 2,倒數第二個是索引 3,依此類推——這個相當奇怪的約定與 GCM 內部的工作方式有關)。

然後我們計算 GCM 認證密鑰 $ H_0 = AES_{K_0}(0) $ 和 $ H_1 = AES_{K_1}(0) $

然後,消息的標籤 $ K_0 $ 可以表示為:

$$ C_0 + M_i H_0^i $$

在哪裡 $ C_0 $ 是一個函式 $ K_0 $ 、nonce 和選定的消息、AAD 塊和 $ M_i $ 是我們將放入密文塊的值 $ i $ . 一種簡單的計算方法是在其中插入 0 $ M_i $ 會去,並像往常一樣計算標籤。

同樣,消息的標籤 $ K_1 $ 是:

$$ C_1 + M_i H_1^i $$

所以,要找到 $ M_i $ 為了使它們具有相同的標籤,我們將兩者等同起來,結果是:

$$ M_i = (H_0^i + H_1^i)^{-1}(C_0 + C_1) $$

(記住,我們在 $ GF(2^{128}) $ ; 加法和減法是同一個運算,所以我們通常把它表示為加法;在不同的領域,這將被寫成 $ (H_0^i - H_1^i)^{-1}(C_0 - C_1) $ )

將其放入密文中,包括適當的標籤(可通過上述公式計算),然後就可以了。

這種方法可以擴展到查找將解密的消息 $ k $ 不同的鍵(通過使用 $ k-1 $ 空閒塊)。

這是否可以擴展到相同的加密和經過身份驗證的密文解密為兩個有意義但截然不同的文件的噩夢(對於某些標准文件/存檔格式)?

不完全的; 攻擊者可以選擇密文,以便在其中一個密鑰下解密所選消息(除了那個塊);但是,這使他無法控制其他解密。

通過對 AES 做出合理的假設,可以證明攻擊者無法做得更好(至少對於 96 位隨機數)。GCM 通過操作將密文轉換為明文(假設解密有效) $ P_i = C_i \oplus AES_k( N(i) ) $ , 在哪裡 $ N(i) $ 是隨機數和塊索引的組合)。因此,對於該塊,兩個解密明文的異或將是 $ AES_{k_0}( N(i) ) \oplus AES_{k_1}( N(i)) $ ,這將是不可控的。

96 位以外的 Nonce 大小將更難分析(如 $ N(i) $ 現在成為鍵的功能);但是也沒有明顯的方法來打破它。

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