|
发表于 2003-6-25 13:14:53| 字数 3,223| - 中国–广东–深圳 电信
|
显示全部楼层
回复: 问一个困惑我很久的问题
呵呵,sice说的很简单明了,酷!
WEP使用的是RC系列算法,802.11b的WEP加密算法是RC4算法。
RC4是1987年提出的加密算法,作为一种分组密码体系,被广泛使用于计算机保密通信领域。
感兴趣的话,我把源代码贴出来,不过这不是完整的,还需要revealed和tar几个解释程序包:
#include <stdio.h>
#define buf_size 1024
typedef struct rc4_key
{
[$nbsp][$nbsp][$nbsp]unsigned char state[256];
[$nbsp][$nbsp][$nbsp]unsigned char x;
[$nbsp][$nbsp][$nbsp]unsigned char y;
} rc4_key;
#define swap_byte(x,y) t = *(x); *(x) = *(y); *(y) = t
void prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key)
{
[$nbsp][$nbsp]int i;
[$nbsp][$nbsp]unsigned char t;
[$nbsp][$nbsp]unsigned char swapByte;
[$nbsp][$nbsp]unsigned char index1;
[$nbsp][$nbsp]unsigned char index2;
[$nbsp][$nbsp]unsigned char* state;
[$nbsp][$nbsp]short counter;
[$nbsp][$nbsp]state = [$key->state[0]]
[$nbsp][$nbsp]for(counter = 0; counter < 256; counter++)
[$nbsp][$nbsp]state[counter] = counter;
[$nbsp][$nbsp]key->x = 0;
[$nbsp][$nbsp]key->y = 0;
[$nbsp][$nbsp]index1 = 0;
[$nbsp][$nbsp]index2 = 0;
[$nbsp][$nbsp]for(counter = 0; counter < 256; counter++)
[$nbsp][$nbsp]{
[$nbsp][$nbsp][$nbsp][$nbsp]index2 = (key_data_ptr[index1] + state[counter] + index2) % 256;
[$nbsp][$nbsp][$nbsp][$nbsp]swap_byte([$state[counter], &state[index2])]
[$nbsp][$nbsp][$nbsp][$nbsp]index1 = (index1 + 1) % key_data_len;
[$nbsp][$nbsp]}
}
void rc4(unsigned char *buffer_ptr, int buffer_len, rc4_key *key)
{
[$nbsp][$nbsp]unsigned char t;
[$nbsp][$nbsp]unsigned char x;
[$nbsp][$nbsp]unsigned char y;
[$nbsp][$nbsp]unsigned char* state;
[$nbsp][$nbsp]unsigned char xorIndex;
[$nbsp][$nbsp]short counter;
[$nbsp][$nbsp]x = key->x;
[$nbsp][$nbsp]y = key->y;
[$nbsp][$nbsp]state = [$key->state[0]]
[$nbsp][$nbsp]for(counter = 0; counter < buffer_len; counter++)
[$nbsp][$nbsp]{
[$nbsp][$nbsp][$nbsp][$nbsp]x = (x + 1) % 256;
[$nbsp][$nbsp][$nbsp][$nbsp]y = (state[x] + y) % 256;
[$nbsp][$nbsp][$nbsp][$nbsp]swap_byte([$state[x], &state[y])]
[$nbsp][$nbsp][$nbsp][$nbsp]xorIndex = (state[x] + state[y]) % 256;
[$nbsp][$nbsp][$nbsp][$nbsp]buffer_ptr[counter] ^= state[xorIndex];
[$nbsp][$nbsp]}
[$nbsp][$nbsp]key->x = x;
[$nbsp][$nbsp]key->y = y;
}
int main(int argc, char* argv[])
{
[$nbsp][$nbsp]char seed[256];
[$nbsp][$nbsp]char data[512];
[$nbsp][$nbsp]char buf[buf_size];
[$nbsp][$nbsp]char digit[5];
[$nbsp][$nbsp]int hex, rd,i;
[$nbsp][$nbsp]int n;
[$nbsp][$nbsp]rc4_key key;
[$nbsp][$nbsp]if (argc < 2)
[$nbsp][$nbsp]{
[$nbsp][$nbsp][$nbsp][$nbsp]fprintf(stderr,"%s key <in >out\n",argv[0]);
[$nbsp][$nbsp][$nbsp][$nbsp]exit(1);
[$nbsp][$nbsp]}
[$nbsp][$nbsp]strcpy(data,argv[1]);
[$nbsp][$nbsp]n = strlen(data);
[$nbsp][$nbsp]if (n&1)
[$nbsp][$nbsp]{
[$nbsp][$nbsp][$nbsp][$nbsp]strcat(data,"0");
[$nbsp][$nbsp][$nbsp][$nbsp]n++;
[$nbsp][$nbsp]}
[$nbsp][$nbsp]n/=2;
[$nbsp][$nbsp]strcpy(digit,"AA");
[$nbsp][$nbsp]for (i=0;i<n;i++)
[$nbsp][$nbsp]{
[$nbsp][$nbsp][$nbsp][$nbsp]digit[2] = data[i*2];
[$nbsp][$nbsp][$nbsp][$nbsp]digit[3] = data[i*2+1];
[$nbsp][$nbsp][$nbsp][$nbsp]sscanf(digit,"%x",[$hex)]
[$nbsp][$nbsp][$nbsp][$nbsp]seed = hex;
[$nbsp][$nbsp]}
[$nbsp][$nbsp]prepare_key(seed,n,[$key)]
[$nbsp][$nbsp]rd = fread(buf,1,buf_size,stdin);
[$nbsp][$nbsp]while (rd>0)
[$nbsp][$nbsp]{
[$nbsp][$nbsp][$nbsp][$nbsp]rc4(buf,rd,[$key)]
[$nbsp][$nbsp][$nbsp][$nbsp]fwrite(buf,1,rd,stdout);
[$nbsp][$nbsp][$nbsp][$nbsp]rd = fread(buf,1,buf_size,stdin);
[$nbsp][$nbsp]}
} |
|