RC4,如果我們知道明文和密文,則找到密鑰
擁有純文字 A 和密文 B。當我們想解密同樣使用相同密鑰加密的文本 C 時,我們能否以某種方式檢索密鑰?
正確答案取決於您是要恢復密鑰還是密鑰流。讓我們先回顧一下 RC4 是如何工作的:
RC4 回顧
RC4 將密鑰作為輸入並生成加密安全的偽隨機數流:
$ KS= RC4(k) $
要加密明文消息 M,我們只需將其與密鑰流 KS 進行異或:
$ KS= RC4(k) $
$ C= M \oplus KS $
要解密密文,我們必須通過提供與 RC4 輸入相同的共享密鑰來重現密鑰流:
$ M= C \oplus KS $
現在,至關重要的是,相同的密鑰流永遠不會被兩次用於加密,因為攻擊者可以學習兩條消息的異或:
$ C1= M1 \oplus KS $
$ C2= M2 \oplus KS $
$ C1 \oplus C2= M1 \oplus KS \oplus M2 \oplus KS= M1 \oplus M2 $
針對 RC4 的已知明文攻擊
RC4 密鑰流恢復:一旦你擁有明文,這是一件微不足道的事情:
$ KS= C \oplus M $
這通常不是問題,因為對密碼學有基本了解的人都不會使用相同的密鑰流來加密多條消息。但是,如果我正確理解了描述,您將遇到以下情況:
$ B= A \oplus RC4(K) $
$ D= C \oplus RC4(K) $
如果攻擊者擁有 A、B 和 D,提取 RC4(K) 生成的密鑰流並解密消息 C(至少與 A 長度相同)是很簡單的:
$ C= D \oplus B \oplus A $
例子:
假設 RC4 產生以下密鑰流:
KS= 11010110 00011010 01101011 10001110 11001101 11011111 01001010
使用消息 A=“hello” 和 C=“secret!",您將獲得以下密文:
A = 01101000 01100101 01101100 01101100 01101111 C = 01110011 01100101 01100011 01110010 01100101 01110100 00100001 B = 10111110 01111111 00000111 11100010 10100010 D = 10100101 01111111 00001000 11111100 10101000 10101011 01101011
通過計算 $ A \oplus B $ ,您將獲得密鑰流的前 5 個字節,這使您可以解密 C 的前 5 個字節。如果不知道密鑰或更長的明文-密文對,您將無法解密 C 的其餘部分!
注意:您已經在這個例子中看到了為什麼重複使用密鑰流是一個壞主意:B 和 D 的密文的第二個字節是相同的,因為它們都加密了相同的字元(“e”)。
RC4 密鑰恢復:恢復密鑰 K 要困難得多。存在一大類密鑰,其中一小部分秘密密鑰決定了密鑰流的大量比特。這就是為什麼建議丟棄密鑰流的前 256 個字節的原因(現在建議根本不使用 RC4)。觀察到在密鑰下生成的足夠多的明文/密文對最終可以被Fluhrer 等人的攻擊所利用。,導致攻擊者恢復密鑰。