Cryptanalysis
增量RC4算法?
我目前正在分析一個顯然使用 RC4 的客戶端-伺服器應用程序。我有密鑰和隨機數,我對他們加密數據包的方法感到非常驚訝。
由於我不是密碼學專家,我將解釋我做了什麼以使其有效。
- 我用完整的密鑰(nonce + secret)創建了一個字元串,並且我附加了所有未加密的字節而不在任何時候清除它
- 我 RC4 整個字元串(顯然隨著時間的推移而增長)
- 我對結果字元串進行切片,以便剪切所有舊字節,只剩下我的“新字節”
我無法想像伺服器端會為每個連接的客戶端維護整個字節歷史記錄,因此我想知道它是某種 RC4 算法/修改還是自定義實現
如果我理解正確,您正在分析的協議在加密之前不會重新初始化加密,所以它似乎正在加密它發送的所有內容,並且只發送“新”部分。
為了回答您的問題,讓我們對流密碼(如 RC4)進行一些討論。這些密碼基本上生成一個隨機數流,然後與明文進行異或運算。要解密,您必須再次生成密鑰流,然後將其與密文進行異或。
$ C = P \oplus K $
$ P = C \oplus K $
( $ C $ 是密文, $ P $ 是明文, $ K $ 是密鑰流和 $ \oplus $ 是異或)
這種密碼的一個特性是,要加密或解密一個部分,您只需要密鑰流的相關部分。因此,在您的協議中,可能會發生以下情況:
客戶端:
- 計算 $ K_{0} $
- 發送 $ C_0 = P_0 \oplus K_0 $
- 計算 $ K_1 $
- 發送 $ C_1 = P_1 \oplus K_1 $
注意客戶端不需要 $ K_0 $ 也不 $ P_0 $ 加密 $ P_1 $ .
伺服器端:
- 計算 $ K_0 $
- 收到 $ C_0 $ 並使用解密它 $ P_0 = C_0 \oplus K_0 $
- 計算 $ K_1 $
- 收到 $ C_1 $ 並使用解密它 $ P_1 = C_1 \oplus K_1 $ ,伺服器不需要 $ K_0 $ 也不 $ P_0 $ 解密 $ C_1 $ ,因此它不必執行您在逆向工程時所做的操作。