RC4 Stream Cipher Algorithm
(2007-11-24 15:42)
Rivest 是MIT教授,RSA发明人之一,那个R。(Ronald L. Rivest')。
http://people.csail.mit.edu/rivest/
此人是密码学集大成者,主要成果有:RSA公钥加密算法;MD2-MD5系列hash算法;RC2-RC6系列对称加密算法。
RC4是Rivest 在1987年设计的密钥长度可变的流加密算法。起初是RSA公司私有的商业机密。
在1994年9月,它的算法被人匿名发布在互联网上,从此公开。
现在广泛应用在网络传输上。
RC4也被叫做ARC4(Alleged RC4,所谓的RC4),因为RSA从来就没有正式发布过这个算法。
可以参看:
linux-2.4.35.2cryptoarc4.c
算法非常简单美妙。就是256内的加法,置换,异或。
由于简单,所以速度极快,算法的速度可以达到DES的10倍左右。
算法描述就几行代码。三行代码,产生一个伪随机器。很难再找出这么短小精悍的算法。
为了安全起见,建议密钥长度大于128 bits(16字节)。
// rc4 Stream Cipher Algorithm
typedef unsigned char u8;
typedef struct rc4_key_ctx{
u8 state[256];
u8 x;
u8 y;
} rc4_key;
void rc4_set_key(u8 *pass_data, unsigned int pass_len, rc4_key *key);
void rc4_crypt(u8 *buf_out, u8 *buf_in, unsigned int buf_len, rc4_key *key);
__inline void swap_byte(u8 *a, u8 *b)
{
u8 swap;
swap = *a;
*a = *b;
*b = swap;
return;
}
// pass_len: 1 bytes - 256 bytes
void rc4_set_key
(u8 *pass_data, unsigned int pass_len, rc4_key *key)
{
u8 *p;
unsigned int i,j,k;
key->x = 0;
key->y = 0;
p = &key->state[0];
for (i = 0; i < 256; i++)
p[i] = i;
j = k = 0;
for (i = 0; i < 256; i++) {
j = ( j + pass_data[k] + p[i] ) & 0xFF;
swap_byte (&p[i], &p[j]);
k++;
if(k >= pass_len)
k = 0;
}
return;
}
void rc4_crypt
(u8 *buf_out, u8 *buf_in, unsigned int buf_len, rc4_key *key)
{
u8 x;
u8 y;
u8 *p;
u8 *p_in, *p_out;
x = key->x;
y = key->y;
p = key->state;
p_in = (u8 *)buf_in;
p_out = (u8 *)buf_out;
while(buffer_len--) {
x = (x + 1) & 0xFF;
y = (y + p[x])& 0xFF;
swap_byte (&p[x], &p[y]);
*p_out++ = *p_in++ ^ p[(p[x] + p[y])&0xFF];
}
key->x = x;
key->y = y;
return;
}