Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: алгоритм rc4
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
sKWO
Добрый всем день!
Насколько я ничего не знаю, то декодирование закодированных данных
по данному алгоритму сводится к "исключающему или" байтов с байтами
проинициализированного массива кейстрима.
То есть операция кодирования идентична декодированию.
А у меня это не получается. Подскажите что не так?
вот код:
CODE
#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

В последнем случае хотелось увидеть исходную последовательность sad.gif
yuri_d
Перед вторым вызовом rc4() необходим prepare_key() с теми же самыми параметрами (ключом).
sKWO
Цитата(yuri_d @ Jul 8 2013, 03:45) *
Перед вторым вызовом rc4() необходим prepare_key() с теми же самыми параметрами (ключом).

Спасибо заработало. Никогда и не подумал бы что кейстрим портится. wacko.gif
RED_BULLok
Можно перестановку без временной переменной сделать.
Код
#define swap_byte(x,y)  x^= y; y ^= x; x ^= y
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.