RC4

简介

RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码

RC4是流密码中的一种,为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇。起初该算法是商业机密,直到1994年,它才公诸于众。由于RC4具有算法简单,运算速度快,软硬件实现都十分容易等优点,使其在一些协议和标准里得到了广泛应用。

流密码也属于对称密码,但与分组加密算法不同的是,流密码不对明文数据进行分组,而是用密钥生成与明文一样长短的密码流对明文进行加密,加解密使用相同的密钥

算法内容

RC4算法加密流程:包括密钥调度算法KSA伪随机子密码生成算法PRGA两大部分(以密钥长度为256个字节为例)。

步骤:

  1. 初始化S表

    • 对S表线性填充,一般为256字节

    image-20250330171633586

    • 使用key密钥通过密钥调度算法KSA初始置换S表

      image-20250330171817825
      1
      2
      3
      4
      5
      6
      具体就是: j = (j + S[i] + key [i % key.length]) % 256
      然后交换 S[i] 与 S[j] 的值
      最终得到新的S表

      由于Java的byte类型是有符号的(范围:-128到127),但我们需要的是无符号值(0到255)。
      & 0xFF 的作用是截取低8位,丢弃符号位扩展的高位,得到正确的无符号值。
  2. 密钥流的生成(为明文每个字节生成一个伪随机数)

    伪随机数生成算法:

    1
    2
    3
    4
    i = (i + 1) mod 256
    j = (j + S[i]) mod 256
    swap S[i] and S[j]
    K = S[(S[i] + S[j]) mod 256]

    之后将明文与K进行异或即可

  3. 加解密:

    image-20250330172627005

    因为:

    1
    2
    3
    明文 ^ K = 密文
    密文 ^ K = 明文
    所以RC4加解密是一致的
  4. 运行

image-20250330172933980