AES 函式中的混淆和擴散
我在思考,完整的 AES 輪包含的四個功能中的每一個(添加輪密鑰、替換字節、移位行和混合列)如何增加了完整 AES 的混亂和擴散。
我的理解是
- 添加圓鍵:混亂
- 替代字節:混亂
- 移位行:擴散
- 混合柱:混淆和擴散
我的理解正確嗎?實際上有兩個部分,我很不確定:
- 可以在沒有秘密(subBytes)的情況下引入混亂嗎?
- 可以僅從狀態(混合列)引入混亂嗎?
首先我應該說,概念混淆和擴散不能提供對 AES 設計的深入理解,僅僅是因為它們不夠具體。相反,理解輪換步驟選擇的關鍵是寬步道策略。
也就是說,我們當然可以嘗試理解每個轉換對“混淆”/“擴散”概念的影響。不用說,這種思想實驗的結果至少有些主觀。無論如何,正確定義“混淆”/“擴散”是必不可少的。在保密系統的通信理論中,香農寫道:
有兩種方法(除了求助於理想系統)表明自己會挫敗統計分析。這些我們可以稱之為擴散和混淆的方法。在擴散方法中的統計結構 $ M $ 這導致它的冗餘被“消散”到長距離統計中——即,進入涉及密碼中長字母組合的統計結構。這裡的效果是敵人必須攔截大量的材料來束縛這個結構,因為這個結構只在非常小的個體機率的塊中是明顯的。此外,即使他有足夠的材料,所需的分析工作也要大得多,因為冗餘已經分散到大量個人統計數據中。
混淆的方法是使簡單統計量之間的關係 $ E $ 和簡單的描述 $ K $ 一個非常複雜和涉及的。在簡單替換的情況下,很容易描述 $ K $ 由字母頻率強加 $ E $ . 如果連接非常複雜和混亂,敵人可能仍然能夠評估統計數據 $ S_1 $ ,例如,這將密鑰限制在密鑰空間的某個區域。但是,此限制適用於某些複雜區域 $ R $ 在這個空間裡,也許“永遠折疊”了很多次,他很難利用它。第二個統計 $ S_2 $ 限制 $ K $ 更進一步 $ R_2 $ ,因此它位於交叉區域;但這並沒有多大幫助,因為很難確定交叉點是什麼。
我想說的第一條評論是,如果使用上面的直覺來描述,擴散和混淆通常只能通過重複應用圓形變換來產生。香農使用以下比喻(用於建構“混合變換”):
好的混合變換通常是由兩個簡單的非對易操作的重複乘積形成的。例如,Hopf 已經表明,糕點麵團可以通過這樣的一系列操作進行混合。先把麵團擀成薄板,然後對折,然後捲起來,再對折,等等。
出於這個原因,我的回答主要是關於每個轉換如何導致混淆/擴散(而不是這些轉換是否有貢獻)。
擴散
套用 AES 的上下文,有人可能會說擴散意味著明文塊的“統計結構”(這是相當模糊的)散佈在生成的密文塊上。例如,如果第一個輸入位很可能為零,則這在輸出位的任何小子集中都不應該很明顯。(請注意,如果不是這種情況,將獲得強線性近似。)不幸的是,這非常模糊,實際上如果您正在設計分組密碼,則實際上並沒有真正的幫助。
請注意,上述對擴散的解釋與香農的“長期統計”有些不同,因為後者可能被解釋為“非相鄰/關閉位”而不是“位的小子集”。我認為“小子集”才是真正的意思,因為香農還談到了“密碼中字母 [ ~bits ] 的**長組合”(強調我的)。
有了這個解釋:
- AddRoundKey不利於擴散。(嗯……你可以爭辯說他們這樣做是有原因的,但我們不要討論這個。)
- ShiftRows 和 MixColumns:這些操作在行或列之間混合位。因此,您可以說這確保了“非本地化統計”(同樣,有些模糊)。同樣,線性層必須“混合”位這一事實還不夠具體,不足以對設計人員非常有用——最大化活動 S-box 的數量(參見寬軌跡)是真正的基本思想。
- SubBytes導致字節級別的擴散。如果您將“符號”視為字節,那麼您可以爭辯說 SubBytes 不提供擴散。我認為說 SubBytes確實有助於整體傳播更準確。
最後一點可能需要澄清一下。通常說 S-box 提供了混淆(順便說一下,這是正確的,見下文)而不是擴散。儘管如此,考慮一種密碼,例如 PRESENT,它對其線性層使用按位排列。顯然,如果你去掉 PRESENT 的 S-box 層,那麼結果就不能滿足上面提到的擴散背後的直覺。在這種情況下,我關於統計飽和攻擊的另一個答案似乎是相關的。
當然,如果您在 AES 中刪除 SubBytes,整個密碼將變得仿射 $ \mathbb F_{2^8} $ . 更多關於下面的內容。
混亂
根據香農的說法,困惑完全在於密鑰。這個想法是,密鑰以如此“複雜”的方式混合到輸出中(這肯定又是模糊的),一個簡單/合理的測試統計 $ s $ 只允許您得出結論,密鑰必須滿足一些複雜的方程 $ f(K) = s $ . 香農指出,如果 $ f $ 足夠複雜,也應該很難將不同統計數據提供的資訊結合起來。
現在,什麼是複雜的 $ f $ ? 這很難形式化,但至少可以想到一些事情 $ f $ 不該是。例如:
- 如果我們採取 $ s $ 為一個或多個已知明文對應的密文,那麼顯然 $ f $ 應該是非線性的(否則只能求解線性方程組)。事實上,“非線性”本身是不夠的:還有一大類所謂的代數攻擊。
- 如果我們採取 $ s $ 是一些明文和密文比特之和的(估計的)偏差,那麼 $ f(K) $ 不應該(大致) $ (-1)^{\kappa} $ 在哪裡 $ \kappa $ 是一些關鍵位的線性組合。事實上,這是松井的第一個線性密碼分析算法。
- …(可以從這個角度考慮大多數其他攻擊。)
也就是說,我將對 AES 中的步驟得出以下結論:
- AddRoundKey對於混淆是必不可少的,因為您需要有某種方式將密鑰(這就是混淆的含義)與狀態混合。
- ShiftRows 和 MixColumns:這些操作通常與擴散相關,但它們也是獲得整體混亂所必需的。實際上,如果您不混合列(或行),那麼描述 AES 的方程將很容易求解。
- 子字節對於混淆是必不可少的。特別是,它是非線性的。請注意,僅 SubBytes 顯然是不夠的。
- 不應該忘記**關鍵時間表。**它也有助於(或者更確切地說,可能有助於)混亂。
在現代密碼學中,“混淆”經常被用在更廣泛的意義上。例如,即使在沒有密鑰的情況下(例如在基於排列的密碼學中),人們也可以合理地談論混淆。這是一個不同的問題。
結論
我應該重申,“混淆”和“擴散”是相當模糊的。充其量,這些概念可以讓您對為什麼有可能建構安全分組密碼有一些直覺。它們不足以真正理解現代分組密碼(如 AES)的設計。
只是為了確保您能清楚地回答您的具體問題:
可以在沒有秘密(subBytes)的情況下引入混亂嗎?
可以僅從狀態(混合列)引入混亂嗎?
第一個問題的答案是否定的,但我必須指出,SubBytes 在 AES 中不是秘密。(但如果打算使用“AddRoundKey”,答案仍然是否定的。)第二個問題也必須以否定的方式回答,請參閱上面關於非線性的評論。