Stream-Cipher

跳過流密碼的第一個輸出

  • May 25, 2022

我記得在某處讀到,有時在某些流密碼中,有必要跳過它們產生的第一個值。我現在找不到這方面的任何資訊。

但這似乎是有道理的。就像散列函式在返回隨機結果之前需要執行許多輪一樣,CSPRNG 需要一些迭代次數,以便無法從第一個結果中獲得種子和密鑰資訊。

你如何確定這必須是多少次迭代?或者還有其他方法可以解決這個問題嗎?為了使第一次迭代的結果是隨機的,使用隨機密鑰和種子(也可以將其視為密鑰)進行適當的初始化就足夠了。但我不認為這解決了第一個生成器結果的問題。您仍然可以從這些第一個結果中讀取一些關鍵屬性,就像您在散列函式中沒有做足夠多的輪次一樣。

PS我測試我們必須跳過多少次迭代的想法是將CSPRNG視為帶有鍵的雜湊函式並通過數字提供 $ 1,2,3,… $ 作為帶有一些鍵的種子,特別是經過特別選擇以使它們看起來很弱(但也帶有隨機鍵)。然後看看這樣的雜湊函式是否通過了統計測試,比如 PractRand。這將是最低限度的條件。它仍然不排除會有復雜的密碼攻擊方法從尋找 PracRand 的數字中挑選出密鑰位作為隨機數。

我記得在某處讀到,有時在某些流密碼中,有必要跳過它們產生的第一個值。

不是一些流密碼,而是一種特定的密碼:RC4。RC4 來自更早的時代,當時密碼原語沒有受到大量審查——事實上,它最初是一種秘密算法。RC4 的設計一經公開,便發現了許多弱點。主要弱點是密鑰流開始時的偏差。RC4 在首次發現基於這種偏見的攻擊時很流行,對策是丟棄前幾個字節。隨著時間的推移,偏差分析得到了改進,這使得丟棄不足,RC4逐漸失去了人氣。

RC4 有一個非常簡單的設計:每一輪都包含一些簡單的內部狀態加擾,並發出一個字節的輸出。事實證明,在有足夠的輪次之前,輸出是可以預測的。

大多數密碼在發出任何輸出之前都會執行多輪加擾。常用密碼已通過密碼學研究社區多年的研究得到驗證。

就像散列函式在返回隨機結果之前需要執行許多輪一樣,CSPRNG 需要一些迭代次數,以便無法從第一個結果中獲得種子和密鑰資訊。

是和不是。確實,CSPRNG 需要足夠的種子加擾。但這種加擾是算法的基本組成部分。典型的現代 CSPRNG 要麼基於雜湊(內部已經有很多輪),要麼基於塊或流密碼(內部已經有很多輪)。

我測試我們必須跳過多少次迭代的想法是將 CSPRNG 視為帶有鍵的雜湊函式,並通過數字 1、2、3、… 作為帶有一些鍵的種子來提供它

這是一種有效且流行的密鑰派生函式方法——從種子中確定性地生成偽隨機材料。(請注意,我說的是從高熵材料派生的密鑰,而不是基於密碼的密鑰派生,也稱為密鑰拉伸,它有不同的要求。)遵循這種範式的密鑰派生算法的範例是NIST SP 800-108計數器模式下的 KDFHKDF

然而,作為一個隨機生成器,這種方法缺少一些東西——順便說一下,RC4 也缺少一些東西(這使得它成為 CSPRNG 的一個糟糕選擇,儘管它很受歡迎)。它缺乏回溯阻力:如果狀態受到損害,這會損害未來的 RNG 輸出,但不會損害過去的輸出。回溯阻力需要在每次發出輸出時對 RNG 的狀態進行單向轉換。任何使用常量秘密和公共變數來生成輸出的結構都缺乏回溯阻力。

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