在密碼學中，**RC4**（來自的縮寫）是一種串流加密法，密鑰长度可变。它加解密使用相同的密钥，因此也属于对称加密算法。RC4是有线等效加密（WEP）中采用的加密算法，也曾经是TLS可采用的算法之一。

RC4是由美國密碼學家羅納德·李維斯特（）在1987年设计的。由于RC4算法存在弱点，2015年2月所發佈的 RFC 7465 规定禁止在TLS中使用RC4加密算法。

RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变，范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥，伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据，而且在加密过程中S盒会变化。

由于异或运算的对合性，RC4加密解密使用同一套算法。

歷史
--

RC4是由RSA Security的罗纳德·李维斯特在1987年开发出来的，虽然它的官方名是"Rivest Cipher 4"，但是首字母缩写RC也可以理解为"Ron's Code"。（见RC2，RC5，RC6）

RC4开始时是商业机密，没有公开发表出来，但是在1994年9月份的时候，它被人匿名公开在了Cypherpunks 邮件列表上，很快它就被发到了sci.crypt 新闻组上，随后从这传播到了互联网的许多站点。随之贴出的代码后来被证明是真实的，因为它的输出跟取得了RC4版权的私有软件的输出是完全相同的。由于算法已经公开，RC4也就不再是商业秘密了，只是它的名字"RC4"仍然是一个注册商标。RC4经常被称作是"ARCFOUR"或者"ARC4"（意思是称为RC4），这样来避免商标使用的问题。RSA Security从来没有正式公布这个算法，罗纳德·李维斯特在2008年的自己的课程笔记中给出了一个指向RC4的英文维基百科文章的链接，并且在2014年的文件中确认了RC4及其代码的历史。

RC4已经成为一些协议和标准的一部分，如1997年的WEP和2003年的WPA；和1995年的SSL，以及1999年的TLS。2015年由 RFC 7465 禁止RC4在所有版本的TLS中使用。

虛擬碼
---

初始化长度为256的S盒。第一个for循环将0到255的互不重复的元素装入S盒。第二个for循环根据密钥打乱S盒。

```
 for i from 0 to 255
 S[i] := i
 endfor
 j := 0
 for( i=0 ; i<256 ; i++)
 j := (j + S[i] + key[i mod keylength]) % 256
 swap values of S[i] and S[j]
 endfor

```

下面i,j是两个指针。每收到一个字节，就进行while循环。通过一定的算法（(a),(b)）定位S盒中的一个元素，并与输入字节异或，得到k。循环中还改变了S盒（(c)）。如果输入的是明文，输出的就是密文；如果输入的是密文，输出的就是明文。

```
 i := 0
 j := 0
 while GeneratingOutput:
 i := (i + 1) mod 256 //a
 j := (j + S[i]) mod 256 //b
 swap values of S[i] and S[j] //c
 k := inputByte ^ S[(S[i] + S[j]) % 256]
 output K
 endwhile

```

此算法保证每256次循环中S盒的每个元素至少被交换过一次。

破解
--

2015年，比利時魯汶大學的研究人員Mathy Vanhoef及Frank Piessens，公布了針對RC4加密演算法的新型攻擊程式，可在75小時內取得cookie的內容。

参考文献
----

1. ↑  Andrei Popov.. IETF. February 2015  [2015-02-18]. （原始内容存档于2015-02-20）.
2. ↑ .  [2017-06-18]. （原始内容存档于2017-07-15）.
3. ↑  Rivest, Ron; Schuldt, Jacob (27 October 2014). "Spritz – a spongy RC4-like stream cipher and hash function" (PDF) （页面存档备份，存于）. Retrieved 26 October 2014.
4. ↑   （页面存档备份，存于） RC4 NOMORE

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
 流密码 |
| --- |
|  |
| 广泛使用的密码 | 
* Crypto-1
* RC4
* ChaCha
* 流模式下的分组密码

 |
|  |
| eSTREAM（英语：）组合 | 

|  |  |
| --- | --- |
| 软件 | 
* HC-256（英语：）
* Rabbit（英语：）
* Salsa20
* SOSEMANUK（英语：）

 |
|  |
| 硬件 | 
* Grain（英语：）
* MICKEY（英语：）
* Trivium

 |

 |
|  |
| 其他密码 | 
* A5/1
* A5/2
* Achterbahn（英语：）
* E0（英语：）
* F-FCSR（英语：）
* FISH（英语：）
* ISAAC（英语：）
* MUGI（英语：）
* Panama（英语：）
* Phelix（英语：）
* Pike（英语：）
* Py（英语：）
* QUAD（英语：）
* Scream（英语：）
* SEAL（英语：）
* SNOW (密码)（英语：）
* SOBER（英语：）
* SOBER-128（英语：）
* VEST（英语：）
* VMPC（英语：）
* WAKE（英语：）
* ZUC

 |
|  |
| 理论 | 
* 移位寄存器
* 线性反馈移位寄存器
* 非线性反馈移位寄存器
* 互缩生成器（英语：）
* T-函数（英语：）
* 初始向量

 |
|  |
| 攻击 | 
* 相关攻击（英语：）
* 相关免疫性（英语：）
* 流密码攻击（英语：）

 |

 |

 |
|  |
| 

| * 
* 论
* 编
密码学 |
| --- |
|  |
| 
* 密码学历史
* 密码分析
* 密碼學主題列表

 |
|  |
| 
* 對稱密鑰加密
* 分组密码
* 流密码
* 公开密钥加密
* 密碼雜湊函數
* 訊息鑑別碼
* 随机数
* 隐写术

 |
|  |
| 
* 分类 分类
* 主题 主题
* 专题 专题

 |

 |

 |