#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#define KEY_LENGTH 6
#define TEXT_LENGTH 10
typedef struct RC4_KEY_S{
unsigned char S[256];
}RC4_KEY;
/*S is initialized to the identity permutation, mixes in bytes of the key.*/
void RC4_key(RC4_KEY *rc4_key, unsigned char *key, int keylength){
int i, j, temp;
/*Initialize S*/
for (i = 0; i < 256; i++)
rc4_key -> S[i] = i;
j = 0;
for (i = 0; i < 256; i++){
j = (j + rc4_key -> S[i] + *(key + i % keylength)) % 256;
/*Swap rc4_key -> S[i] and rc4_key -> S[j]*/
temp = rc4_key -> S[i];
rc4_key -> S[i] = rc4_key -> S[j];
rc4_key -> S[j] = temp;
}
}
/*Generate the key stream which length is the same as plaintext's and encrypt the plaintext and output the ciphertext.*/
void RC4(RC4_KEY *rc4_key, unsigned char *plaintext, int plaintext_length, unsigned char *ciphertext){
int i = 0, j = 0, n, temp;
for (i = 0; i < plaintext_length; i++){
i = (i + 1) % 256;
j = (j + rc4_key -> S[i]) % 256;
/*Swap rc4_key -> S[i] and rc4_key -> S[j]*/
temp = rc4_key -> S[i];
rc4_key -> S[i] = rc4_key -> S[j];
rc4_key -> S[j] = temp;
n = rc4_key -> S[(rc4_key -> S[i] + rc4_key -> S[j]) % 256];
/*Encryption*/
*(ciphertext + i) = *(plaintext + i) ^ n;
}
}
int main(int, char **, char **)
{
int i, x;
unsigned char plaintext[256] = {"www.dllhook.com"};
unsigned char key[] = "123456789";
unsigned char ciphertext[256] = {0};
RC4_KEY rc4_key;
printf("------------------------------\n----------RC4 CIPHER----------\n------------------------------\n");
/*Encryption*/
int key_len = sizeof(key)-1;
int plaintext_length = sizeof(plaintext);
RC4_key(&rc4_key, key, key_len);
RC4(&rc4_key, plaintext, plaintext_length, ciphertext);
printf("The plaintext is: ");
for (i = 0; i < TEXT_LENGTH; i++)
printf("%x ", plaintext[i]);
printf("\nThe key is: ");
for (i = 0; i < KEY_LENGTH; i++)
printf("%x ", key[i]);
printf("\nThe ciphertext is: ");
for (i = 0; i <TEXT_LENGTH; i++)
printf("%x ", ciphertext[i]);
printf("\n\n");
return 0;
}
发表评论