Key-Size

RC2、RC4、RC5 密鑰長度

  • February 16, 2021

在閱讀 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 字節,並設置兩個計數器ij. 該鍵為您提供填充 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 年。

引用自:https://crypto.stackexchange.com/questions/9682