Алгоритмы

Главная
Понятие алгоритма
Больше про алгоритмы
Анализ
Теория алгоритмов
Основные конструкции
Сортировка
Математика
Геометрия
Комбинаторика
Сжатие и кодирование
Сжатие изображений
Шифрование
Исходники

Статьи

Что такое информация
Искусственный интеллект
Чего не может компьютер
Модемы
История архитектуры ПК
CD-ROM


В 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

Назад

   
плитка Alligator . http://kidsobuv.ru/

© algoritmy.info 2007-2010