k2 應該如何在 RC4A 流密碼(RC4 的修改)中產生?
RC4A 是對簡單 RC4 流密碼的輕微修改,旨在增強其抵禦多種攻擊的能力。這是那張紙。
然而在論文中,第二個鍵
k2
只被提到了兩次,並且只提供了它應該是什麼的鬆散描述:我們隨機選擇一個密鑰
k1
。另一個密鑰k2
也由一個偽隨機位生成器(例如 RC4)生成,k1
用作種子。應用密鑰調度算法,如圖 1 所述,我們構造了兩個 S-boxS1
並分別S2
使用密鑰k1
和k2
。這裡的主要內容是“使用作為種子
k2
的偽隨機位生成器(例如RC4)生成”,並且“分別使用密鑰和”構造。k1``S1``S2``k1``k2
在 RC4A 的原始碼實現中,我遇到了兩種不同的處理方式
S2
,它們都沒有使用 PRBG 來生成k2
。這導致相同輸入的不同輸出:
- S-box
S1
和S2
完全相同(k1
兩者都使用)。- S-box的所有 256 個值
S1
構成k2
.S2
在密碼學課程中,建議對 使用“nonce” ,它
k2
的長度與k1``k1``k2
最後,另一篇文章似乎表明它
k2
是通過將一些字節從S1
原始 RC4 PRGA 中輸入來產生的,產生一個密鑰流:更具體地說,在 RC4 的 KSA 中,數組 S1 被初始化,使用密鑰 K。WK,16 字節的密鑰流,是從 RC4 的 PRGA 中的數組 S1 生成的。然後,使用 WK 在 RC4 的 KSA 中初始化數組 S2。
我假設在原始文章
K
中指的是k1
和 WK 指的。k2
相關虛擬碼:
RC4_KSA(K, S1) For i = 0 … l – 1 WK[i] = RC4_PRGA(S1) RC4_KSA(WK, S2)
這種方法的一個問題是,在計算 時
k2
,RC4 PRGA 會交換 中的值S1
,從而改變它。S1
在 RC4A PRGA 中使用,並且會產生與未更改的密鑰流不同的密鑰流。這可以通過使用S1
RC4 PRGA 的第二個副本來避免,保持原件不變。因此,第二個密鑰的生成方式存在歧義,
S2
相同輸入的輸出密鑰流實現不同。幾個問題:
- 實踐中這兩種不同的實現是否通過不使用 PRBG/PRGA 來破壞 RC4A 的安全聲明
k2
?- 它是什麼
k2
,它是如何產生的,或者它是否與它一樣重要k1
嗎?- 產生
k2
所有實現都應該遵循的正確方法是什麼?謝謝!
實踐中這兩種不同的實現是否通過不使用 PRBG/PRGA 來產生 k2 來破壞 RC4A 的安全聲明?
我不會這麼認為。我得到的印像是作者只是想讓 k2 從 k1 派生。他們沒有對算法進行太多修改,以至於對 k1 使用不同的密鑰調度。這導致需要使用現有的密鑰調度算法創建第二個排列,因此必須從某個地方找到不同的密鑰。事實證明,不同的實現使用不同的技術。
坦率地說,作者沒有更具體地討論 k2 一代,這有點令人失望。
k2 是什麼,它是如何產生的,或者它是否與 k1 相同是否重要?
通過對圖 3 的粗略檢查,似乎每個交替輸出都來自每個狀態排列。他們之間似乎沒有任何互動。我假設如果 k1 = k2 那麼輸出將是相同的對。這似乎與作者關於通過更多變數提高安全性的評論一致。PRNG 與任何方法一樣好,但是。理想情況下,PRNG 的內部狀態應該等於密鑰的長度,但是由於 RC4 密鑰在技術上可以是 2048 位,所以這是一個問題。很少有較小的 XOR 移位或 LFSR PRNG 具有如此大的狀態。見下文。
生成所有實現都應遵循的 k2 的正確方法是什麼?
同樣,不同的實現使用不同的方式生成 k2 的事實證明沒有合適的方式來生成它。正確的只是 k1 ≠ k2。我個人的選擇是一個簡單的 256 字節隨機生成的 S 盒。注意:作者使用術語 S 框來指代內部狀態數組是令人困惑的。我建議使用真正的 S 盒,以便 k2 = SBOX
$$ k1 $$對於所有字節。 對於初始密鑰流偏差和兩種狀態的生成,有一個很好的替代解決方案。可以使用兩個完全擴展的Pearson 雜湊。一個錯位產生 k1,第二個獨立錯位產生 k2。由於這是 RC4 的新變體,因此無論如何都不能向後兼容密碼。這意味著可以廢棄整個密鑰調度算法。它非常適合,因為完全擴展的 Pearson 雜湊輸出正好是 2048 位。是的,這種散列的最大狀態大小只有 1684 位,但是誰使用具有 210 字節熵的密碼呢?
紙上的意見
我發現第5節很差。每個(甚至是業餘的)密碼學家都知道 RC4 的致命弱點是偏見。事實上,作者的動機是提高 RC4 的安全性。這必然意味著減少偏差。那麼他們怎麼可能在沒有偏見評估的情況下提出 RC4 衍生品呢?如果他們忘記了他們自己創造的可能的偏見,那麼第 2 部分的意義何在?
第 5.3 節中的“減少”還不夠好。他們的孩子通過隨機性測試沒有任何意義。最初的 RC4 也是如此。這說明了目前測試套件的模糊性和普遍性,但也為作者提供了一種逃避。我不知道這是不是故意的。如果他們想要一個快速而骯髒的解決方案,他們所要做的就是在 PRNG 組件之後添加一個馮諾依曼提取器,並且 RC4 變得無偏差。
正如在給您的評論中所指出的,現在可以通過觀察2^23 個輸出來區分 RC4A 。作者開始他們的論文說原始的 RC4 可以在 2^25 輸出后區分。他們似乎已經倒退了,儘管公平地說,攻擊會隨著時間的推移而改善。