Page 2 of 2
Article Index
9°) implémentation C89
typedef struct rc4_key { unsigned char state[256]; unsigned char x, y; } rc4_key; static void swap_byte(unsigned char *a, unsigned char *b) { unsigned char swapByte = *a; *a = *b; *b = swapByte; } void prepare_key(unsigned char *key, int size, rc4_key *k) { unsigned char x, y; unsigned char *state; short i; state = &k->state[0]; k->x = k->y = x = y = 0; for(i = 0; i < 256; i++) state[i] = i; for(i = 0; i < 256; i++) { y = key[x] + state[i] + y; swap_byte(&state[i], &state[y]); x = (x + 1) % size; } } void rc4(unsigned char *data, int count, rc4_key *k, int offset) { unsigned char x, y, idx; unsigned char* state; short i; x = k->x; y = k->y; state = &k->state[0]; for(i = 0; i < offset; ++i) { x++; y = state[x] + y; swap_byte(&state[x], &state[y]); } for(i = 0; i<count; ++i) { x++; y = state[x] + y; swap_byte(&state[x], &state[y]); idx = state[x] + state[y]; data[i] ^= state[idx]; } k->x = x; k->y = y; } int main(int argc, const char **argv) { short i; rc4_key info; unsigned char key[] = "WEP"; unsigned char message[] = "info528"; prepare_key(key, 3, &info); rc4(message, 7, &info, 1234); for(i = 0; i<7; ++i) printf("%02X", message[i]); printf("\n"); }