使用散列(如 SHA-256)與 AES 作為 Feistel 網路中偽隨機值的來源?
這個問題與 Wikipedia article on Format Preserving Encryption有關
它說以下
也可以使用 Feistel 網路製作 FPE 算法。Feistel 網路需要為每一輪的子密鑰提供偽隨機值的來源,並且可以將 AES 算法的輸出用作這些偽隨機值。
但是,我正在查看 FPE(Botan Crypto library)的實現。它基於Bellare、Rogaway 等人的論文“Format-Preserving Encryption”中的FE1 方案
在實現中,我認為它使用 SHA-256 雜湊來生成偽隨機值。
這與使用 AES 算法生成偽隨機值的替代方案相比(在安全性方面)如何?
兩種方法都同樣有效嗎?
Feistel 網路是一種從(可能是不可逆的)函式構造可逆排列的方法。如果使用的函式是偽隨機的並且域很大,則 3-4 輪產生偽隨機排列(如果對手只能提出“計算”查詢,則 3 輪就足夠了,如果對手可以提出“反轉”查詢,則需要 4 輪)。這就是著名的 Luby-Rackoff 結果。在保留格式的結構中,需要更多輪次,因為函式的域可能很小,這意味著可能發生衝突等。
在任何情況下,這些構造都可以使用任何偽隨機函式。因此,將 AES 截斷為適當的輸出長度就可以了。HMAC 也非常合理地被認為是偽隨機函式。普通的 SHA256 是偽隨機函式嗎?嗯,這完全取決於你做什麼。如果你計算 $ F_K(x) = SHA256(K || x) $ 那麼這肯定不是由於擴展攻擊而造成的偽隨機(鑑於 $ F_K(x) $ 可以計算 $ F_K(x||y) $ 對於一些 $ y $ )。但是,如果您知道您只使用固定長度,或者您對該長度進行編碼,那麼這是一個合理的假設。就個人而言,如果您希望自己基於散列函式,我更喜歡 HMAC 假設。但是,我認為 AES 是最好的選擇(它也快得多……)。