RC4是一种串流加密法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。

RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。加密后长度不变。

加密过程

1.初始化S box

1)先生成一个255大小的数组,把0-255填入其中,数组内容1,2,3,4.....,255

2)将用户密钥作为索引打乱Sbox,密钥长度如果不足255,就用mod 计算循环使用。生成出来的Sbox有一定的随机性。

2.使用Sbox进行加密

i := 0
 j := 0
 while GeneratingOutput:
     i := (i + 1) mod 256   //a
     j := (j + S[i]) mod 256 //b
     swap values of S[i] and S[j]  //c
     k := inputByte ^ S[(S[i] + S[j]) % 256]
     output K
 endwhile

S[(S[i] + S[j]) % 256]为密钥流中的一位。原始数据和S[(S[i] + S[j]) % 256]进行xor,得到加密后的数据。由于每次加密前都会变换Sbox,所以每轮sbox的内容都不一样,使密钥流随机。

例子:

void Init_Sbox(unsigned char *sbox,unsigned char* key,unsigned int key_len){
    for(int i = 0;i < 256;++i){
        sbox[i] = i;
    }
    
    unsigned int j = 0;
    for(int n = 0 ;n < 256; n++){
        j = (j + sbox[n] + key[n % key_len]) % 256;
        //swap sbox
        unsigned char tmp = sbox[j];
        sbox[j] = sbox[n];
        sbox[n] = tmp;
    }

}

void RC4Crypt(unsigned char* data_in,unsigned char* output ,unsigned int data_len, unsigned char* key, unsigned int key_len){
	unsigned char Sbox[256];
	Init_Sbox(Sbox, key, key_len);
	unsigned int i = 0, j = 0, t = 0;
	for (int x = 0; x < data_len; ++x)
	{
		i = (i + 1) % 256;
		j = (j + Sbox[i]) % 256;
		//swap
		unsigned char tmp = Sbox[i];
		Sbox[i] = Sbox[j];
		Sbox[j] = tmp;
		
		t = (Sbox[i] + Sbox[j]) % 256;
		output[x] = data_in[x] ^ Sbox[t];
	}
}

参考:

https://zh.wikipedia.org/wiki/RC4