# RC4 算法的基本原理:

RC4 属于对称密码算法中的流密码加密算法,它的密钥长度是可变的,它以一个足够大的表 S 为基础,对表进行非线性变换,产生密钥流

对称密码:加密和解密使用的是同一个密钥,即明文和密钥异或生成密文

流密码:逐字节,一个字节一个字节进行加密,和它对应的是块加密(分组加密),比较有代表性的就是 DES 加密算法(我还没学)

既然是逐字节进行加密,那么它的重点就是密钥了,RC4 算法是一个密钥长度可变的加密算法,也就是说它的密钥可以是任意长度,而这个密钥流就是以一个足够大的 S 表为基础,并对其进行非线性变换产生的

# 加密过程

# 初始化 S 表

  1. 对 S 表进行线性填充,一般为 256 个字节
  2. 种子密钥填充另一个 256 字节的 K 表
  3. 用 K 表对 S 表进行初始置换

# 密钥流的生成

为每个待加密的字节生成一个伪随机数,用来进行异或运算(表 S 一旦生成,种子密钥就不再被使用)

# 初始化 S 表:

第一步,我们首先对 S 表进行一个升序填充,从 0 到 255,也就是 S [0]=0,S [1]=1,S [2]=2,直到 S [255]=255;第二步要用到密钥,也就是种子密钥,用种子密钥来填充另一个 256 字节的 K 表,这个密钥的长度一般不会很长,比如我们现在密钥是 3,4,5,那么我们就用 3,4,5 来循环填充这个 K 表一直到 K [255];第三步用 K 表对 S 表进行初始置换,也就是从 S [0] 开始到 S [255],对每个 S [i] 根据 K [i] 确定的一个方案,将 S [i] 置换为 S 中的另一个字节,对于这个初始置换,我们举一个例子

S 表:

0 1 2 3 4 5 6
S[0] S[1] S[2] S[3] S[4] S[5] S[6]

K 表:

3 4 5 3 4 5 3
K[0] K[1] K[2] K[3] K[4] K[5] K[6]

置换:

1
2
3
4
j=0;
for i=0 to 255 do
j=(j+S[i]+K[i]) mod 256; //实际上只要除以7就可以了,因为我们举的例子是7位的表
Swap(S[i], S[j]);

我们取 i,j 都为 0,从 0 到 255 开始查值,然后通过第三行 j 的计算得到一个下标,那么我们就把当前操作位的值和这一位的值进行一个置换,比如第 0 位的计算过程是这样的:

1
j=(0+S[0]+K[0]) mod 7 = 3 mod 7 = 3

所以我们将第 0 位的值和第三位的值进行一个交换,那么从 0 到 6 每个值都进行变换之后我们就得到了一个新的 S 表:

3 0 1 4 5 2 6
S[0] S[1] S[2] S[3] S[4] S[5] S[6]

# 密钥流的生成:

因为是流密码,所以我们要为每一个待加密的字节生成一个用来与之进行异或运算的伪随机值,这个数值也是从 S 表中获取,所以我们要做的就是找到这个随机数的下标,也就是这个随机数是 S 几,下面是生成密钥流的操作:

1
2
3
4
5
6
7
i,j=0;
for r=0 to len do //r为明文长度,r字节
i=(i+1) mod 256;
j=(j+S[i]) mod 256;
swap(S[i], S[j]);
t=(S[i]+S[j]) mod 256;
K[r]=S[t];

这个 K 就是伪随机数值所组成的一个数组,t 是 S 的下标,我们就是要找到这个下标也就是这个 t,那么这个 t 又是通过 S [i] 和 S [j] 来进行计算,然后 i 和 j 又是通过第 3、4 行来计算,即:

1
2
3
i=(i+1) mod 7 = 0+1 mod 7 = 1
j=(j+S[i]) mod 7 = 0+S[1] mod 7 = 0+0 mod 7 = 0
swap(S[0], S[1]);

需要注意的是,在每次算完 i 和 j 之后都会有两个值的交换,也就是说每一轮之后这个 S 表都是变了的,都是不一样的,然后计算 t 后将对应下标的值传给 K 表:

1
2
3
t = S[0]+S[1] mod 7 = 3;
S[3] = 4;
K[0] = S[3] = 4;

那么和 S [0] 进行异或运算的伪随机数就是这个 K [0],以此类推,最终得到密文

# 总结:

以一个 256 字节的 S 表为基础,使用密钥填充一个 K 表,再用这个 K 表对 S 表进行初始置换,密钥不同生成的 S 表也不同,然后我们要取明文的长度,明文多长,密钥流就多长,通过运算生成密钥流,这个运算过程就是一个找下标 t 的过程,而每一次的随机数的生成都会对 S 表(此时的 S 表是明文长度的 S 表)进行两个数字的置换,所以每一轮的 S 表都是不同的,最后我们拿这个密钥流也就是 K 表,与明文一一对应地进行异或运算,得出密文,这就是总体的过程

实战可以看这篇博客:DASCTF×SU2022-easyre | ChengHan’s Blog (tchdv.cn)

参考视频 ——RC4 加密算法 | 流密码 | 对称密码 | 密码学 | 信息安全_哔哩哔哩_bilibili