sKWO 0 Posted July 7, 2013 · Report post Добрый всем день! Насколько я ничего не знаю, то декодирование закодированных данных по данному алгоритму сводится к "исключающему или" байтов с байтами проинициализированного массива кейстрима. То есть операция кодирования идентична декодированию. А у меня это не получается. Подскажите что не так? вот код: #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 В последнем случае хотелось увидеть исходную последовательность :( Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
yuri_d 0 Posted July 7, 2013 · Report post Перед вторым вызовом rc4() необходим prepare_key() с теми же самыми параметрами (ключом). Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sKWO 0 Posted July 8, 2013 · Report post Перед вторым вызовом rc4() необходим prepare_key() с теми же самыми параметрами (ключом). Спасибо заработало. Никогда и не подумал бы что кейстрим портится. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
RED_BULLok 0 Posted October 14, 2013 · Report post Можно перестановку без временной переменной сделать. #define swap_byte(x,y) x^= y; y ^= x; x ^= y Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...