rc4.c (27 lines of code) (raw):
#include "rc4.h"
void swap(uint8_t *a, uint8_t *b) {
uint8_t temp = *a;
*a = *b;
*b = temp;
}
void rc4(const uint8_t *key, size_t key_len, uint8_t *data, size_t data_len) {
uint8_t S[256];
uint32_t i = 0;
uint32_t j = 0;
uint32_t t = 0;
uint32_t k = 0;
for (i = 0; i < 256; i++) {
S[i] = i;
}
for (i = j = 0; i < 256; i++) {
j = (j + S[i] + key[i % key_len]) % 256;
swap(&S[i], &S[j]);
}
for (i = j = t = 0; t < data_len; t++) {
i = (i + 1) % 256;
j = (j + S[i]) % 256;
swap(&S[i], &S[j]);
k = S[(S[i] + S[j]) % 256];
data[t] ^= k;
}
}