#include <stdio.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
extern uint8_t dinoxor(uint8_t x0, uint8_t x1);
void swap(uint8_t *a, uint8_t *b) {
uint8_t temp = *a;
*a = *b;
*b = temp;
}
void KSA(char *key, uint8_t S[256]) {
int len = strlen(key);
for(int i = 0; i < 256; i++)
S[i] = i;
int j = 0;
for(int i = 0; i < 256; i++) {
j = (j + S[i] + key[i % len]) % 256;
swap(&S[i], &S[j]);
}
}
void PRGA(uint8_t S[256], uint8_t *plaintext, uint8_t *ciphertext, size_t len) {
int i = 0, j = 0;
for(size_t n = 0; n < len; n++) {
i = (i + 1) % 256;
j = (j + S[i]) % 256;
swap(&S[i], &S[j]);
uint8_t rnd = S[(S[i] + S[j]) % 256]; ciphertext[n] = rnd ^ plaintext[n]; }
}
void RC4(char *key, uint8_t *plaintext, uint8_t *ciphertext, size_t len) {
uint8_t S[256]; KSA(key, S); PRGA(S, plaintext, ciphertext, len); }
int main() {
char *key = "Key"; uint8_t plaintext[] = "Plaintext"; size_t len = sizeof(plaintext) - 1; uint8_t ciphertext[len];
RC4(key, plaintext, ciphertext, len);
printf("Ciphertext: ");
for(size_t i = 0; i < len; i++)
printf("%02hhX", ciphertext[i]); printf("\n");
uint8_t decryptedtext[len]; RC4(key, ciphertext, decryptedtext, len); printf("Decrypted Text: ");
for(size_t i = 0; i < len; i++)
printf("%c", decryptedtext[i]); printf("\n");
return 0;
}