RC4流程
RC4流程
- 用1-256字节(8-2048位)的可变长度密钥初始化一个256字节的状态向量S,S的元素为S[0], S[1], S[2]…… S[255]。
- 从始至终,置换后的S包含0-255的所有8位数
- 加密和解密时,按某种系统化的方法从S的256个元素中选出字节k,每生成一个k,重新排列S的元素
一、初始化S
-
开始时,S中的元素按升序被设置为0-255,即S[0]=0, S[1]=1,…S[255]=255
-
同时建立一个临时向量T
- 若密钥K的长度为256字节,则将密钥K赋给T
- 若密钥长度为keylen个字节(keylen<256),则将密钥K的值赋给T的前keylen个元素,并循环复用密钥K的值赋给T剩下的元素,直到T的所有元素都被赋值
/*初始化*/ for i = 0 to 255 do S[i] = i; T[i] = K[i mod keylen];
-
然后用T产生S的初始置换,从S[0]到S[255],对每个S[i],根据由T[i]确定的方案,将S[i]置换为S中的另一字节
/*S的初始置换*/ j = 0; for i = 0 to 255 do j = (j + S[i] + T[i]) mod 256; Swap(S[i], S[j]);
1、本操作目的是打乱S,使S的排列随机;
2、对S的唯一操作是交换,所以唯一的改变就是置换,S仍然包含所有值为0-255的元素
二、密钥流产生
-
向量S一旦完成初始化,输入的密钥K就不再被使用
-
密钥流生成过程是:从S[0]到S[255],对每个S[i],根据S的当前配置,将S[i]与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];
k是0-255区间的随机数
- 加密时,将k与明文异或
- 解密时,将k与密文异或
三、RC4的强度
- RC4曾一度被认为是最安全的算法之一,在WEP等协议中被广泛采用
- RC4强度核心是密钥序列重复周期
- 2015年,比利时鲁汶大学的研究人员Mathy Vanhoef及Frank Piessens,公布了针对RC4加密算法的新型攻击程式,可在75小时内取得cookie的内容
- 2015年,TLS禁止了RC4的使用