RC4简介
rc4加密由Ron Rivest 于1987年为RSA Security公司设计,是一种可变密钥长度,面向字节的流密码 ,广泛应用于 web SSL/TLS, wireless WEP/WPA等
1.RC4算法原理
用一个长度为1到256个字节(8~2048位)的可变长度密钥来初始化一个256个字节的状态向量S,S的元素记为S[0],S[1],…S[255],从始至终S包含所有从0到255的数字
a.RC4密钥调度
首先初始化状态向量S[i],同时由可变密钥K生成中间向量T
/*
初始化S同时生成中间向量T
*/
for i = 0 to 255 do
S[i] = i
T[i] = K[i mod keylen]
(初始化过程一旦完成,密钥K将不再被使用)
然后由中间向量T对S做进行初始置换来打乱S的顺序
/*
对S进行初始置换
*/
j = 0
for i = 0 to 255 do
j = (j + S[i] + T[i]) (mod 256)
swap (S[i], S[j])
b.密钥流的生成及加密
继续加密扰乱S的顺序,对每个S[i]将其与S中的另一字节交换,再将两个被扰乱的值进行相加,得到流密钥在数据S的位置,最后使用流密钥去加/解密消息字节
i = j = 0
for each message byte Mi
//继续加密扰乱S的顺序
i = (i + 1) (mod 256)
j = (j + S[i]) (mod 256)
//交换S[i]与S[j]的位置
swap(S[i], S[j])
//两个被扰乱的值进行相加,得到流密钥在数据S的位置
t = (S[i] + S[j]) (mod 256)
//使用流密钥S[t]去(加/解密)异或下一消息字节Mi
Ci = Mi XOR S[t]
2.RC4弱密钥及其推导
RC4存在弱密钥使得其在初始置换后S的顺序不变即密钥失去作用
初始置换的代码如下
/*
对S进行初始置换
*/
j = 0
for i = 0 to 255 do
j = (j + S[i] + T[i]) (mod 256)
swap (S[i], S[j])
已知S中的元素不会重复,若使交换S[i], S[j]的顺序后S的顺序并未发生改变,则i = j,即i = (j + S[i] + T[i]) (mod 256),这里我们可以只推导其中的一组弱密钥,则可以认为i = (j + S[i] + T[i])
则
i =0 --> j+S[0]+T[0] = 0,此时j = 0,则T[0] = 0,j = j+S[0]+T[0] = 0;
i =1 --> j+S[1]+T[1] = 1,此时j = 0,则T[1] = 0,j = j+S[1]+T[1] = 1;
i =2 --> j+S[2]+T[2] = 2,此时j = 1,则T[1] = 255,j = j+S[2]+T[2] = 2;
…
i = 255 --> j+S[255]+T[255]=255,此时j = 254,则T[255] = 2,j = j+S[255]+T[255] = 255;
又因为T是由K推导出来的,则可以认为K[0] = 0,K[1] = 0,K[2] = 255,…,K[255] = 2是RC4的一组弱密钥