歷史
RC4是由羅納德·李維斯特在1987年開發出來的,雖然它的官方名是“Rivest Cipher 4”,但是首字母縮寫RC也可以理解為"Ron's Code"。
RC4開始時是商業密碼,沒有公開發表出來,但是在1994年9月份的時候,它被人匿名公開在了Cypherpunks 郵件列表上,很快它就被發到了sci.crypt 新聞組上,隨後從這傳播到了網際網路的許多站點。隨之貼出的代碼後來被證明是真實的,因為它的輸出跟取得了RC4著作權的私有軟體的輸出是完全相同的。由於算法已經公開,RC4也就不再是商業秘密了,只是它的名字“RC4”仍然是一個註冊商標。RC4經常被稱作是“ARCFOUR”或者"ARC4"(意思是稱為RC4),這樣來避免商標使用的問題
RC4已經成為一些常用的協定和標準的一部分,如1997年的WEP和2003/2004年無線卡的WPA; 和1995年的SSL,以及後來1999年的TLS。讓它如此廣泛分布和使用的主要因素是它不可思議的簡單和速度,不管是軟體還是硬體,實現起來都十分容易。
原理
RC4算法的原理很簡單,包括初始化算法(KSA)和偽隨機子密碼生成算法(PRGA)兩大部分。假設S-box的長度為256,密鑰長度為Len。先來看看算法的初始化部分(用C代碼表示):
其中,參數1是一個256長度的char型數組,定義為: unsigned char sBox[256];
參數2是密鑰,其內容可以隨便定義:char key[256];
參數3是密鑰的長度,Len = strlen(key);
在初始化的過程中,密鑰的主要功能是將S-box攪亂,i確保S-box的每個元素都得到處理,j保證S-box的攪亂是隨機的。而不同的S-box在經過偽隨機子密碼生成算法的處理後可以得到不同的子密鑰序列,將S-box和明文進行xor運算,得到密文,解密過程也完全相同。
再來看看算法的加密部分(用C代碼表示):
其中,參數1是上邊rc4_init函式中,被攪亂的S-box;
參數2是需要加密的數據data;
參數3是data的長度.
最後,在main函式中,調用順序如下:
因此最終的完整程式是:
漏洞
由於RC4算法加密是採用的xor,所以,一旦子密鑰序列出現了重複,密文就有可能被破解。關於如何破解xor加密,請參看Bruce Schneier的Applied Cryptography一書的1.4節Simple XOR,在此我就不細說了。那么,RC4算法生成的子密鑰序列是否會出現重複呢?由於存在部分弱密鑰,使得子密鑰序列在不到100萬位元組內就發生了完全的重複,如果是部分重複,則可能在不到10萬位元組內就能發生重複,因此,推薦在使用RC4算法時,必須對加密密鑰進行測試,判斷其是否為弱密鑰。其不足主要體現於,在無線網路中IV(初始化向量)不變性漏洞。
而且,根據目前的分析結果,沒有任何的分析對於密鑰長度達到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!
分散式代碼管理網站Github從2015年1月5日將停止對RC4的支持,RC4作為一種老舊的驗證和加密算法易於受到黑客攻擊。這意味著,用戶在使用Windows XP系統上的IE瀏覽器時將無法進入github.com網站。
破解
2015年,比利時魯汶大學的研究人員Mathy Vanhoef及Frank Piessens,公布了針對RC4加密算法的新型攻擊程式,可在75小時內取得cookie的內容。