RC4是一种流密码和可变长度密钥算法。该算法一次加密一个字节(或一次加密更大的单位)。
密钥输入是伪随机位生成器,它产生一个流 8 位数字,在不知道输入密钥的情况下是不可预测的,生成器的输出称为密钥流,一次一个字节与使用 X-的明文流密码组合或操作。
例子:
RC4 Encryption
10011000 ? 01010000 = 11001000
RC4 Decryption
11001000 ? 01010000 = 10011000
密钥生成算法——
1 到 256 字节的可变长度密钥用于初始化 256 字节的状态向量 S,元素为 S[0] 到 S[255]。对于加密和解密,通过以系统方式选择 255 个条目之一从 S 生成字节 k,然后再次排列 S 中的条目。
- 密钥调度算法:
初始化:将 S 的条目设置为从 0 到 255 按升序排列的值,创建临时向量 T。
如果密钥 k 的长度为 256 字节,则将 k 分配给 T。否则,对于长度为 (k-len) 字节的密钥,从 K 复制的 T 的前 k-len 个元素,然后将 K 重复为根据需要多次填充 T。 这个想法说明如下:for i = 0 to 255 do S[i] = i; T[i] = K[i mod k - len];
我们使用 T 来生成 S 的初始排列。从 S[0] 到 S[255],对于每个 S[i] 算法,根据 T[i] 规定的方案,将其与 S 中的另一个字节交换,但是S 仍将包含从 0 到 255 的值:
j = 0; for i = 0 to 255 do { j = (j + S[i] + T[i])mod 256; Swap(S[i], S[j]); }
- 伪随机生成算法(Stream Generation):
一旦向量 S 被初始化,输入键将不会被使用。在这一步中,对于每个 S[i] 算法,根据 S 的当前配置规定的方案,将其与 S 中的另一个字节交换。 到达 S[255] 后,过程继续,再次从 S[0] 开始i, j = 0; while (true) i = (i + 1)mod 256; j = (j + S[i])mod 256; Swap(S[i], S[j]); t = (S[i] + S[j])mod 256; k = S[t];
- 使用 X-Or() 加密:
新闻:
2015 年 9 月,微软宣布停止在 Microsoft Edge 和 Internet Explorer 11 中使用 RC4。
该视频给出了 RC4 算法的清晰示例