RC2、RC4、RC5 密鑰長度
在閱讀 RC4 上的 Wiki 頁面時,我注意到密鑰大小必須在 40–2,048 位的範圍內。那麼我應該這樣理解,我可以擁有一個長度為 333 位的密鑰嗎?( 40-2048 之間的任何十進制數?)輸入長度如何?
想像一下,我可以要求使用者給我一個輸入長度(例如,1027)和密鑰長度(比如說,359),我可以使用它們嗎?
關於 RC2 的相同問題 - 密鑰大小必須在 8-128 範圍內
$$ bits $$和 RC5 - 密鑰大小必須在 0 - 2040 範圍內$$ bits $$. 我可以使用給定範圍內的任何密鑰長度嗎?即使是異國情調的,比如,我不知道,879 或 123 位作為密鑰的長度?
是的,您可以擁有該範圍內任意長度的密鑰(只要它是整數字節),但實際上,為什麼呢?絕對沒有理由這樣做。
- 如果密鑰是均勻分佈的,那麼任何超過 256 位的內容都是多餘的,完全沒有意義。
- 如果密鑰不是均勻分佈的(可能是密碼或其他內容),則不應直接將其用作 RC4 密鑰。相反,您應該首先對其進行散列(最好使用 PBKDF2 之類的慢速散列)並將結果用作 RC4 密鑰;並且散列的輸出將是 128 位或 256 位,所以同樣,範圍無關緊要。
底線:如果您需要詢問密鑰長度的確切範圍,您可能錯誤地使用了 RC4。相反,堅持使用 128-256 位長的密鑰,並且使用加密質量的偽隨機數生成器或使用合適的散列/KDF 函式均勻分佈和生成。
更新:根據 Henno Brandsma 的評論(謝謝!),顯然 RC2 確實允許其密鑰的任意位長度。但是,這不會改變底線。我不建議使用不尋常的長度鍵。堅持普通長度,如 128 位或 256 位。
簡而言之,短密鑰容易受到某種類型的攻擊,超過 2048 位的密鑰資訊剛剛被丟棄,而奇異的密鑰(那些未與字節對齊)實際上要麼通過您的實現與字節對齊,要麼只是一個非常壞主意,取決於。
RC4 是一個相當簡單的算法,讓我們通過初始化來看看會發生什麼。
首先,準備一個 256 字節的增量數組,例如:
sbox[] for i in 0 to 255: sbox.append(i)
然後獲取一些密鑰
k
並準備一個單獨key_array
的 256 字節數組,只需循環該密鑰即可將其填滿。key_index = 0 while len(key_array) < 256: key_array.append(key[key_index]) key_index = key_index + 1 if key_index > len(key): key_index = 0
因此,任何超過 2048 位(即 256 字節)的內容都會被丟棄。
現在您將遍歷這兩個數組,從 0 步進到 255,將在每個數組的索引處找到的內容相加,並將該和添加到計數器(mod 256)。然後,您將交換 sbox 中的兩個值,使用該執行計數器作為一個值的索引,並將目前索引步驟用作另一個值。
for i in 0 to 255: j = (j + self.sbox[i] + key_array[i]) mod 256 swap(self.sbox[j], self.sbox[i])
現在,當您查看前幾個
i
’s 時,還沒有太多的改組。這些字節可能會在稍後再次混洗,但如果您可以做出一些假設,您可能能夠在初始化後檢測到密鑰和 sbox 的前幾個字節之間的偏差。碰巧這種攻擊對 5 字節及以下的密鑰特別有效,因此這可能是避免使用 40 位以下密鑰的警告的來源。有趣的是,這種攻擊並不僅僅停留在 5 個字節上,成功的機率隨著密鑰大小的增加而下降,直到對於超過 16 個字節的密鑰變得基本上不切實際。
至於奇異鍵,大多數簡單的實現只需要字節。因此,如果您提供 333 位,它可能只是被解釋為 336 位(42 字節)密鑰,可能帶有幾個填充的 0。
如果實現沒有將您的輸入填充到最近的字節,並且只是在密鑰數組中的 2048 個可用位中循環它,那麼您可能已經有效地提供了一個 2048 位密鑰。由於 333 與 8 沒有公因數,因此它不會與偶數字節對齊,直到 2668 位,在我們的密鑰數組已滿之後。因此,除了 333 位密鑰中的重複模式外,您可能無意中生成了相當於 256 字節密鑰的內容。
順便說一句,256 字節的密鑰聽起來很棒,但實際上它並沒有像你想像的那樣給你買那麼多的熵。sbox 的初始化導致用資訊填充 256 字節,並設置兩個計數器
i
和j
. 該鍵為您提供填充 256 字節、255 字節或 254 等選項。因此,256 可能不一定會在僅 180 字節的密鑰上提供任何額外的熵。另外,請注意,許多研究都涉及重複密鑰攻擊,因此正如 DW 指出的那樣,採取一些措施確保您沒有重複密鑰非常重要。Rivest 建議採用 (key, 初始化向量) 並將其傳遞給雜湊函式,因此即使是重複的初始化向量也不會導致後續鍵之間的任何關係。另一個研究領域檢查 PRNG 中的偏見,直到它“解決”。大多數實現建議在初始化中添加另一個值,在設置期間要丟棄幾輪 PRNG(Rivest 建議丟棄前 256 個字節)。
RC4 是最簡單的一種,因此也是研究最深入的流密碼之一。很難跟上所有不同類別的攻擊,並確定哪些理論攻擊具有實際適用性。所以不要把這當作 RC4 永遠安全的保證,繼續檢查研究。
針對大密鑰的相關密鑰攻擊:
- Chen, J., Miyaji, A. 相關密鑰模型下對流密碼 RC4 的新實用密鑰恢復攻擊。電腦科學講義 (LNCS),第 6584 卷,第 62-76 頁。2011 年。
- AL Grosul 和 DS Wallach,RC4 的相關密鑰密碼分析。技術報告-00-358,萊斯大學電腦科學系。2000.(注意:256 字節密鑰特別糟糕。)
使用密鑰調度算法對小密鑰進行攻擊:
- Paul, G., Maitra, S. RC4 密鑰調度後的排列揭示了密鑰。LNCS,第 4876 卷,第 260-377 頁。2007 年。
- Biham, E., Carmeli, Y. 從內部狀態高效重建 RC4 密鑰。LNCS,第 5086 卷,第 270-288 頁。2008 年。
- Akgun, M., Kavak, P., Demirci, H. RC4 關鍵調度算法的新結果。LNCS,第 5365 卷,第 40-52 頁。2008 年。
其他弱點
- Fluhrer, S.、Mantin, I.、Shamir, A. RC4 密鑰調度算法的弱點,在 2001 年密碼學選定領域第八屆年度研討會上發表。
Rivest 對 RC4 的防禦
- Rivest, R. RSA 對 RC4 密鑰調度算法弱點的安全響應。技術說明,RSA 實驗室。2002 年。