Jump to content

    
Sign in to follow this  
sKWO

алгоритм rc4

Recommended Posts

Добрый всем день!

Насколько я ничего не знаю, то декодирование закодированных данных

по данному алгоритму сводится к "исключающему или" байтов с байтами

проинициализированного массива кейстрима.

То есть операция кодирования идентична декодированию.

А у меня это не получается. Подскажите что не так?

вот код:

#include <stdio.h>
typedef struct rc4_key
{      
  unsigned char state[256];       
  unsigned char x;        
  unsigned char y;
} rc4_key;

#define NUM_ELEM(x) (sizeof (x) / sizeof (*(x)))
#define swap_byte(x,y) t = *(x); *(x) = *(y); *(y) = t
unsigned char buf1[] = {0xA5, 0xC3,0xAA, 0xDD, 0xBB, 0x00};

void prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key)
{
 unsigned char t;
 unsigned char index1;
 unsigned char index2;
 unsigned char* state;
 short counter;

 state = &key->state[0];

 for(counter = 0; counter < 256; counter++)
 state[counter] = counter;

 key->x = 0;
 key->y = 0;
 index1 = 0;
 index2 = 0;

 for(counter = 0; counter < 256; counter++)
 {
   index2 = (key_data_ptr[index1] + state[counter] + index2) % 256;
   swap_byte(&state[counter], &state[index2]);
   index1 = (index1 + 1) % key_data_len;
 }
}

void rc4(unsigned char *buffer_ptr, int buffer_len, rc4_key *key)
{
 unsigned char t;
 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]);
   xorIndex = (state[x] + state[y]) % 256;
   buffer_ptr[counter] ^= state[xorIndex];
 }
 key->x = x;
 key->y = y;
}


__task main(void)
{
 rc4_key key;
 unsigned char seed[] = "Key";
 prepare_key(seed,NUM_ELEM(seed),&key);

printf("\n ==============proba rc4 =================\n");
printf("\n ===========вихідні дані для кодування====\n");
for (int i=0; i< sizeof (buf1); ++i)
printf("%2x", buf1[i]);
putchar('\n');

 rc4(buf1,NUM_ELEM(buf1),&key);
printf("\n =============закодовані дані=================\n");
for (int i=0; i< sizeof (buf1); ++i)
printf("%2x", buf1[i]);
putchar('\n');

 rc4(buf1,NUM_ELEM(buf1),&key);
printf("\n ====після повторного кодування===\n");
for (int i=0; i< sizeof (buf1); ++i)
printf("%2x", buf1[i]);
putchar('\n');
}

Ну и получаем в терминале следующее:

==============proba rc4 =================

 

===========вихідні дані для кодування====

a5c3aaddbb 0

 

=============закодовані дані=================

c4dfff43 6d9

 

====після повторного кодування===

13d83dcb44a8

В последнем случае хотелось увидеть исходную последовательность :(

Share this post


Link to post
Share on other sites
Перед вторым вызовом rc4() необходим prepare_key() с теми же самыми параметрами (ключом).

Спасибо заработало. Никогда и не подумал бы что кейстрим портится. :wacko:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this