RC4加密分为两部分:
1、初始化S表
2、生成流密钥
一、初始化S表:
(1)线性填充S表
(2)种子密钥循环填充K表
(3)K表对S表初始置换
1、S表:对S表进行线性填,一般为256字节。如S=[0,1,2.....255]
2、K表:用种子密钥填充另一个256字节的K表,若密钥为345,则K=[3,4,5,3,4,5...]
//种子密钥长度
Len = strlen(key);
//填充S和K表
for(i = 0;i <= 255;i++)
{
s[i] = i;
k[i] = key[i%Len];
}
/*
若key=[3,4,5],则strlen(key)=3
k[0]=key[0%3]=3
k[1]=key[1%3]=4
k[2]=key[2%3]=5
k[3]=key[3%3]=3
...
*/
3、初始置换:
j = 0;
for(int i = 0;i <= 255; i++)
{
j = (j + s[i] + k[i]) % 256;
swap(s[i],s[j]);
}
//i=0,j=0时, j=(0+0+3)%256=3, 此时将S表中的s[0]与s[3]互换,循环256次
密钥主要功能是将S表搅乱,i确保S表的每个元素都得到处理,j保证S表的搅乱是随机的。
二、流密码生成
为每个待加密的字节生成一个伪随机数,用来异或
i,j,t = 0;
for (int r = 0; r <= strlen(plain); r++) //plain为明文序列
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
swap(s[i],s[j]); //每生成一次就变换一次S表中的两个数
t = (s[i] + s[j]) % 256; //s[t]就是目标伪随机数
c[r] = s[t]; //C就是每个明文字节对应的伪随机数列
cypher[r] = plain[r] ^ c[r]
}
不同的S表在经流密钥生成算法后可以得到不同的子密钥序列,将S表和明文进行xor运算,得到密文