1. 简介
RC4 属于同步流密码,同步流密码的加密器分成密钥流产生器和加密变换器两个部分。
2. 特性
密钥长度可变,面向字节操作;
用置换加密(异或)输入消息,每次一个字节;
至少采用 128 128 128 比特的密钥
3. 加密过程
3.1 密钥调度算法(Key-Scheduling Algorithm, 简称 KSA)
由密钥流决定一个 0 ∼ 255 0 \sim 255 0 ∼ 255 的置换
初始化时,状态矢量S被设置为 0 0 0 到 255 255 255 , 即 S [ 0 ] = 0 , S [ 1 ] = 1 , ⋯ , S [ 255 ] = 255 S[0]=0, S[1]=1, \cdots, S[255]=255 S [ 0 ] = 0 , S [ 1 ] = 1 , ⋯ , S [ 255 ] = 255
种子密钥 K K K 为 L L L 个字节,循环填充到矢量 T T T 的 256 256 256 个字节中
由 T [ i ] T[i] T [ i ] 确定将 S [ i ] S[i] S [ i ] 置换为 S S S 中的另一个字节
j = ( j + S [ i ] + T [ i ] ) m o d 256 j = (j + S[i] + T[i]) \mod 256 j = ( j + S [ i ] + T [ i ]) mod 256
由于对S的操作只是置换,因此,S S S 仍然为一个 { 0 , 1 , ⋯ , 255 } \{0,1,\cdots,255\} { 0 , 1 , ⋯ , 255 } 的置换
1 2 3 4 5 6 7 8 9 for i = 0 to 255 do S[i] = i; T[i] = K[i mod L]; j = 0 ; for i = 0 to 255 do j = (j + S[i] + T[i])(mod 256 ) swap (S[i],S[j]);
3.2 伪随机子密钥生成算法(Pseudo Random-Generation Algorithm, 简称 PRGA)
种子密钥不再使用,重复使用向量S生成密钥流
j = ( j + S [ i ] ) m o d 256 j = (j + S[i]) \mod 256 j = ( j + S [ i ]) mod 256
将 S [ i ] S[i] S [ i ] 和 S [ j ] S[j] S [ j ] 进行交换,t = ( S [ i ] + S [ j ] ) m o d 256 t = (S[i]+S[j]) \mod 256 t = ( S [ i ] + S [ j ]) mod 256
K i = S [ t ] K_i=S[t] K i = S [ t ]
当 S [ 255 ] S[255] S [ 255 ] 完成置换后,操作再从 S [ 0 ] S[0] S [ 0 ] 开始重复
1 2 3 4 5 6 7 8 i = j = 0 ; for each message byte Mi i = (i + 1 )(mod 256 ); j = (j + S[i])(mod 256 ); swap (S[i],S[j]); t = (S[i] + S[j])(mod 256 ); Ki = S[t]; Ci = Mi XOR Ki