省略 RC4 的偽隨機生成算法的前兩行會削弱密碼嗎?
美國政府機構發布的特定教育軟體程序使用 RC4 的變體來混淆其數據文件(請參閱Stack Overflow 問題)。所討論的 RC4 變體與標準 RC4 相同,除了在偽隨機生成算法的開頭。開發人員省略了下面的前兩行(來自Wikipedia 的描述),因為他的程式碼基於 2005 年左右 Planet Source Code 的錯誤實現。
i := 0 j := 0 while GeneratingOutput: i := (i + 1) mod 256 j := (j + S[i]) mod 256 swap values of S[i] and S[j] K := S[(S[i] + S[j]) mod 256] output K endwhile
因此,
i
並j
保留它們從密鑰調度算法執行時開始的最終值(i = 256
,不0
,以及j = (j + S[i] + key[i mod keylength]) mod 256
在i = 255
KSA 期間的時間)。在這種情況下,加密沒有提供實際的安全性,因為密鑰被硬編碼到軟體中,但假設開發人員使用該程式碼加密了他硬碟上的秘密文件。這個實現錯誤是否會顯著削弱 RC4 的實力?
是的,這個遺漏削弱了密碼:輸出 $ \mathtt K $ 對於相當大的密鑰類別(65536 中的一個)具有較短的周期(最多 65280 字節)。下面詳細說明原因。
因為早期的程式碼離開了 $ \mathtt i=256 $ 並且第一次執行
i := (i + 1) mod 256
使得它相當於 $ \mathtt i=0 $ , 不初始化 $ \mathtt i $ 對後續程式碼沒有影響;因此沒有任何安全隱患。但是早期的程式碼離開了 $ \mathtt j $ 到一個依賴於鍵的值,因此缺乏初始化 $ \mathtt j $ 有效果。特別是,如果在密鑰調度結束時 $ \mathtt j=1 $ 和 $ \mathtt S[1]=1 $ ,然後(通過歸納)在我們擁有的整個流生成期間 $ \mathtt j=(\mathtt i+1)\bmod 256 $ 和 $ \mathtt S[\mathtt j]=1 $ ; 因此產生的輸出有一個短週期(最多) $ 256\cdot 255 $ 字節。這在真正的 RC4 中從未發生過(正如 Hal Finney 在 1994 年觀察到的,在一個不可能發生的 RC4 循環中,總結在RC4 頁面上),但發生在 $ 2^{-16} $ 修改後的密碼中的密鑰。