Feistel-Network

為什麼 Feistel 網路能夠僅通過以不同順序使用輪密鑰來加密和解密

  • May 22, 2018

使用 feistel 網路來加密一些東西,你可以只使用輪密鑰。但是要解密它,應用相同的過程順序,但是密鑰是相反的。

我的問題是:是什麼讓 Feistel 網路的這種特性成為可能?

簡而言之,因為 XOR 是它自己的逆運算。a XOR b XOR b 又是 a。

要解密加密消息,我們必須反轉輪函式。對於像AES這樣的算法(它不是Feistel網路,而是一個替代置換網路,簡稱SPN),我們必須反轉大多數操作,比如MixColumn操作。這種反轉稱為 InverseMixColumn。從理論上講,我們也必須對任何 Feistel 網路這樣做,但他們幾乎總是使用 XOR 作為一半與改變的另一半的組合。XOR 的倒數又是 XOR,所以我們不必改變它,但可以再次做同樣的事情。

看一下Feistel網路圖。查看加密方案的輸出。現在嘗試扭轉這一點 - 一步一步地回去。您可以將一半再次放入 Round 函式中,獲取中間結果並將其與另一半進行異或。現在您在計算之前取回了輸入。重複此操作,直到您回到原始明文的第一個輸入。您在執行此操作時使用的輪密鑰與加密相同,但順序相反。

這是 4 輪分組密碼的結構。( $ L $ 和 $ R $ 以左右命名,但顯然您可以隨意命名它們。L/R, R/L, 上/下, 東/西, A/B…)

$ (L_0, R_0) = \text{PlainText} $

第1輪:

$ L_1 = L_0 \oplus (F(R_0) \oplus \text{RoundKey}_1 $

$ R_1 = R_0 $

第 2 輪:

$ L_2 = L_1 $

$ R_2 = R_1 \oplus (F(L_1) \oplus \text{RoundKey}_2 $

第三輪:

$ L_3 = L_2 \oplus F(R_2) \space\oplus \text{RoundKey}_3 $

$ R_3 = R_2 $

第四輪:

$ L_4 = L_3 $

$ R_4 = R_3 \oplus F(L_3) \space\oplus \text{RoundKey}_4 $

$ \text{CipherText} = (L_4, R_4) $


基本的 Fiestel 密碼分別在左半部分和右半部分工作。一輪要麼修改 $ L $ 或者 $ R $ 而它用來改變一半的價值只取決於另一半的價值。也就是說,你定義 $ F(x) $ (它不需要是可逆的)。相反,如果你有 $ (x’, y’) = F(x, y) $ 然後解密你需要它的逆, $ F^{-1}(x, y) $ .

查看每輪如何更新值。給你解密 $ \text{CipherText} $ , 所以你知道 $ L_4 $ 和 $ R_4 $ .

你試圖一次撤消一輪,所以你想找到 $ (L_3, R_3) $ 下一個。

一值, $ L $ , 保持不變。(筆記 $ L_3 = L_4 $ )

您通過 XORing 的函式更改的另一個值 $ L_3 $ (或者 $ L_4 $ ) 與最後一輪密鑰。

和 $ L_3 $ 和 $ R_3 $ ,您現在有足夠的數據來撤消第 3 輪。然後對第 2 輪和第 1 輪執行相同操作。

這 $ F $ 函式不知道輪數、輪密鑰和中間狀態。如果您通過逐步過程來撤消加密過程,那麼人們就很清楚為什麼人們說您可以以相反的順序對密鑰使用相同的算法。但是,根據輪數,您可能需要交換左右兩半。

通常使用 XOR(與加法和減法相反),因為 $ G(x) = x \oplus N $ 是它本身, $ G^{-1}(x) = x \oplus N $ .

相反,如果您使用普通的模組化添加,則需要替換 $ + $ 和 $ - $ 在您的實施中。對於空間受限的系統,每個額外的機器程式碼字節都很重要*,使用 XOR 選擇 Fiestel 密碼是有意義的。您優化以最小化空間而不是速度。


*您還想使用分組密碼而不是流密碼或海綿結構。並且您需要在正向和反向模式下使用分組密碼。但是,對於某些模式(如 CTR 模式),您不需要反向使用分組密碼。

SPN 和 ARX 構造具有實現正向和反向操作所需的“缺點”,導致機器程式碼字節數增加一倍。同樣,這可能無關緊要。

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