帮助

三土二园-readyu三土二园 http://readyu.blog.edu.cn[订阅]

三土二园 - by readyu  科学,历史

搜索

正文

RC4 Stream Cipher Algorithm

 (2007-11-24 15:42)
  • 标签: rc4   分类: code
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;
}

0
0
分享到:
评论 (0) | 阅读 (1178) | 收藏 (0)

内容读取中…
发表评论
你还没有登录,现在登录 插入表情
共可输入600个汉字

个人档案

推荐博文

    内容读取中…