linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
阅读:807回复:1

请问在写加密中,能否使用如下C实现的RC4算法,如果不行,该如何实现RC4算法

楼主#
更多 发布于:2007-05-11 11:04
  /* rc4.h */
#ifndef RC
#define RC
typedef struct rc4_key
{
    unsigned char state[256];
    unsigned char x;
    unsigned char y;
} rc4_key;

void prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key);
int crypt(char* data, char* key);
void rc4(unsigned char *buffer_ptr, int buffer_len, rc4_key * key);
#endif

********************************************************************

#include "rc4.h"
#include "string.h"

static void swap_byte(unsigned char *a, unsigned char *b);

void prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key)
{
    //unsigned char swapByte;
    unsigned char index1;
    unsigned char index2;
    unsigned char* state;
    short counter;
    state = &key->state[0];
    for(counter = 0; counter < 256; counter++)
        state[counter] = (unsigned char)counter;
    key->x = 0;
    key->y = 0;
    index1 = 0;
    index2 = 0;
    for(counter = 0; counter < 256; counter++)
    {
        index2 = (key_data_ptr[index1] + state[counter] + index2) % 256;
        swap_byte(&state[counter], &state[index2]);
        index1 = (index1 + 1) % key_data_len;
    }
}

void rc4(unsigned char *buffer_ptr, int buffer_len, rc4_key *key)
{
    unsigned char x;
    unsigned char y;
    unsigned char* state;
    unsigned char xorIndex;
    short counter;
    x = key->x;
    y = key->y;
    state = &key->state[0];
    for(counter = 0; counter < buffer_len; counter ++)
    {
        x = (x + 1) % 256;
        y = (state[x] + y) % 256;
        swap_byte(&state[x], &state[y]);
        xorIndex = (state[x] + state[y]) % 256;
        buffer_ptr[counter] ^= state[xorIndex];
    }
    key->x = x;
    key->y = y;
}

static void swap_byte(unsigned char *a, unsigned char *b)
{
    unsigned char swapByte;
    swapByte = *a;
    *a = *b;
    *b = swapByte;
}

int crypt(char* data, char* key)
{
    int len;
    int cnt;
    rc4_key real_key;
        
    len = strlen(key);

    if(len == 0)
    {
        return -1;
    }

    prepare_key(key, len, &real_key);

    cnt = strlen(data);
    rc4(data, cnt, &real_key);

    return 0;
}
在孤独和无助中缓慢前行...
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-05-16 16:56
哪位高人解答一下我的疑惑好吗?
在孤独和无助中缓慢前行...
游客

返回顶部