Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > потокове шифрование rc4


Автор: XeDuH 28.5.2004, 00:31
Подскажите пример алгоритма, и если не трудно дайте ссылоку на эту тему smile.gif

Зарание спасибо.

Автор: Albinos_x 29.5.2004, 00:43
Введи на yndex.ru криптоалгоритм RC4.
Если не ошибаюсь, то самая первая ссылка которую он выдаст будет с примером реализации алгоритма

Автор: Albinos_x 4.6.2004, 19:57
Приведу код на Си

по нему алгоритм будет проще понять:

#include <stdio.h>

#define buf_size 1024

typedef struct rc4_key
{
unsigned char state[256];
unsigned char x;
unsigned char y;
} rc4_key;

#define swap_byte(x,y) t = *(x); *(x) = *(y); *(y) = t

void prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key)
{
int i;
unsigned char t;
unsigned char swapByte;
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;
}

int main(int argc, char* argv[])
{
char seed[256];
char data[512];
char buf[buf_size];
char digit[5];
int hex, rd,i;
int n;
rc4_key key;

if (argc < 2)
{
fprintf(stderr,"%s key <in >out\n",argv[0]);
exit(1);
}
strcpy(data,argv[1]);
n = strlen(data);
if (n&1)
{
strcat(data,"0");
n++;
}
n/=2;
strcpy(digit,"AA");
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,stdout);
rd = fread(buf,1,buf_size,stdin);
}
}



Автор: Guest 13.9.2004, 05:43
Цитата(Albinos_x @ 4.6.2004, 19:57)

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;


Кто-нидь объясните на [email protected] зачем нужно каждый раз запускать при шифровании этот цикл(для потоков ограниченных каким то пределом допустим 256 байт)
Когда можно получить все первые 256 элементов для xor и в дальнейшем только ксорить без всяких перестановок и перебросок в ключевом массиве или я не понимаю чего-то?
Дайте ссылки на тестовые данные для RC4 с подробным разбором вычислений и итераций, у меня тесты не проходят - хотя алгоритм с точностью до буковки скатан

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)