AES 中的輪數增加
AES-128 需要 10 輪(AES 描述,維基百科)
然而 Bruce Schneier 建議 AES-128 使用 16 輪(Schneier on Security: New Attack on AES)
可以將其實現為 AES-128 的兩個完整加密嗎?那是:
AES_128_ENCRYPT(key, data, mode); // 10 rounds of normal AES 128 AES_128(key, AES_128(key, data, mode), mode); // would this be 20 rounds of AES?
這是否需要像 Triple DES(Triple DES,wikipedia)中那樣使用兩個單獨的鍵?
對任何關於增加 AES 輪次的問題的實際答案是,目前似乎還沒有任何需要,並且任何時候你這樣做都涉及在自定義程式碼中實現至少其中的一部分,這本質上是有風險的。
就兩次執行 AES 而言,看看中間相遇 ( MITM ) 攻擊。考慮到空間要求,我不知道這些與您的目標場景有多大的相關性,但總的來說,它們意味著執行兩次加密的效果僅是執行一次加密的兩倍。
在這篇文章中,我將 AES-128 簡稱為 AES。
您當然不能使用您描述的具有相同密鑰的方案,因為這不會導致 20 輪 AES,因為後半輪的密鑰計劃不正確。此外,由於最後一輪 AES 與中間輪不同,你最終會得到
$$ pre-whitening + 9 rounds + 1 last round $$+$$ pre-whitening + 9 rounds + 1 last round $$ 如果您要從密鑰計劃中提取最終值,您可以使用這些值來生成密鑰計劃的下一次迭代。使用這兩組數據和您自己的 AddRoundKey 實現,您可以刪除最後一輪密鑰,將最後一輪完成為一個完整的中間輪並反轉即將發生的預白化(因為預白化只涉及 xoring in下一輪密鑰計劃)。但是,到您完成此操作為止,您基本上最終自己實現了 AES 的大部分內部結構,而且方式非常混亂。更糟糕的是,任何自製的 AES 實現都可能存在明顯的側通道弱點,因此應該避免。
以下問題(由 SE 向右側提出)可能有助於理解關鍵的日程安排方面: 我如何向 aes 添加更多輪次