Дата добавления: 3 года назад | Просмотров: 627 | Категория: Шифрование
В 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
Все мобильные новинки в интернет-магазине СотМаркет, коммуникаторы htc.
Комментарии:
мустела для детей . Последние новости интернета и блоггинга смотрим на сайте proff-blogging.com.
Добавить комментарий: