|
В 1995 некто опубликовал анонимно в телеконференции sci.crypt исходный текст
алгоритма RC4. По-видиму, данный текст был получен в результате анализа
исполняемого кода. Приведенная ниже программа написана на языке C.
#include
#include
#include
#define buf_size 1024
#define swap_bate(x,y) t = *(x); *(x) = *(y); *(y) = t
typedef struct rc4_key //ключ
{
unsigned char state[256];
unsigned char x;
unsigned char y;
} rc4_key;
//подготовка ключа
void prepare_key(usigned char *key_data_ptr, int key_data_len, rc4_key *key)
{
unsigned char swapByte;
unsigned char index1;
unsigned char index2;
unsigned char* state;
short counter;
state = &key->state[0];
for(counter = 0; counter < 256; counter++)
// S заполняется последовательными значениями от 0...255
state[counter] = counter;
key->x = 0;
key->y = 0;
index1 = 0;
index2 = 0;
for(counter = 0; counter < 256; counter++)
{ // каждый очередной элемент S обменивается местами с элементом
index2 = (key_data_ptr[index1] + state[counter] + index2) % 256;
//номер которого определяется элементом ключа key
//самим элементом и суммой номеров элементов, с которыми происходил об
//мен на предыдущих итерациях.
swap_byte(&state[counter], &state[index2]);
index1 = (index1 + 1) % key_data_len;
}
}
//алгоритм шифрования RC4
void rc4(unsigned char *buffer_ptr, int buffer_len, rc4_key *key)
{
unsigned char x;
unsigned char y;
unsigned char* state;
unsigned char xorIndex;
short counter;
x = key->x;
y = key->y;
state = &key->state[0];
for(counter = 0; counter < buffer_len; counter ++)
{
x = (x + 1) % 256;
y = (state[x] + y) % 256;
swap_byte(&state[x], &state[y]);
//Очередной элемент псевдослучайной перестановки state всех байтов обменивается с
//другим, номер которого равен сумме элементов, выбрнных на предыдущих шагах.
xorIndex = (state[x] + state[y]) % 256;
// В качестве очередного байта выдается значение третьего элемента state, номер
// которого равен сумме первых двух.
buffer_ptr[counter] ^= state[xorIndex];
}
key->x = x;
key->y = y;
}
//Главная программа
int main (int argc, char *argv[])
{
char seed[256];
char data[512];
char buf[buf_size];
char digit[5];
int hex, rd, i, n;
rc4_key key;
clrscr();
if (argc < 2) { fprint(stderr, "%s key out\n", argv[0]; exit(1);}
strcopy(data,argv[1]);
n = strlen(data);
if (n&1) { strcat(data,"0"); n++}
n/=2;
strcpy(digit, "AA");
digit[4] = '\x0';
for (i = 0; i < n; i++)
{
digit[2] = data[i*2];
digit[3] = data [i*2+1];
sscanf(digit, "%x",&hex);
seed[i] = hex;
}
prepare_key(seed, n, &key);
rd = fread(buf, 1, buf_size, stdin);
while (rd >0)
{
rc4(buf, rd, &key);
fwrite(buf, 1, rd, stduot);
rd = fread(buf, 1, buf_size, stdin);
}
}//end programm
Назад
|