📜  RC4 加密算法

📅  最后修改于: 2021-09-27 15:45:43             🧑  作者: Mango

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 中的条目。

  1. 密钥调度算法:
    初始化:将 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]);
        }
    
  2. 伪随机生成算法(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];
    
  3. 使用 X-Or() 加密:

    55

新闻:
2015 年 9 月,微软宣布停止在 Microsoft Edge 和 Internet Explorer 11 中使用 RC4。

该视频给出了 RC4 算法的清晰示例