Алгоритм потокового шифрования RC4 (создан Роном Ривестом в 1987 году) является классикой в своей области, но в последнее время подвергался критике в связи со своей уязвимостью в WEP и TLS. Внимательный анализ однако показывает, что в этих случаях уязвимым был не сам RC4, а его неудачная связка с указанными протоколами. Желающие могут сами углубиться в подробности, мы же здесь лишь отметим, что описанные в криптологической литературе уязвимости RC4 в связке с WEP и TLS к нашей системе никакого отношения не имеют, поскольку те лазейки, через которые там производился взлом, в Extra Systems Cypher Net напрочь отсутствуют.
Реализация алгоритма потокового шифрования RC4 в нашей системе выполнена следующим образом:
typedef struct rc4_key { unsigned char state[256]; unsigned char x; unsigned char y; } rc4_key; void swap_byte(unsigned char *a, unsigned char *b) { unsigned char swapByte; swapByte = *a; *a = *b; *b = swapByte; } void prepare_rc4_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key) { unsigned char index1, 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_crypt_buffer(unsigned char *buffer_ptr, int buffer_len, rc4_key *key) { unsigned char x, 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; } rc4_key rc4_key_table; void encrypt_buffer(unsigned char *buffer_ptr, int buffer_len) { rc4_crypt_buffer(buffer_ptr, buffer_len, &rc4_key_table); } void decrypt_buffer(unsigned char *buffer_ptr, int buffer_len) { rc4_crypt_buffer(buffer_ptr, buffer_len, &rc4_key_table); } void make_crypt_key_table(unsigned char *key_data_ptr, int key_data_len) { unsigned char rc4_trash[RC4_SKIP_TRASH]; prepare_rc4_key(key_data_ptr, key_data_len, &rc4_key_table); encrypt_buffer(rc4_trash, RC4_SKIP_TRASH); }
Вызов в процедуре make_crypt_key_table процедуры encrypt_buffer для «кодирования» буфера rc4_trash размером RC4_SKIP_TRASH байт фактически представляет собой игнорирование некоторого количества начальных байт шифра RC4, которые в современной криптографии считаются «недостаточно надежными». И хотя мы не считаем эти соображения серьезными (особенно благодаря наличию в нашей системе мощного модуля предварительного кодирования), мы все же решили сделать эту уступку доминирующей на данный момент среди криптографов позиции. Конкретное значение RC4_SKIP_TRASH нами не публикуется, тем более что оно может меняться в зависимости от пожеланий конкретного клиента.
Контент этой страницы доступен также на английском, французском, немецком, португальском, испанском, итальянском и украинском языке.
© Extra Systems, 2024 |
|