Extra Systems

CYPHERNET

консольная система надежной коммерческой шифросвязи через сеть интернет

алгоритм потокового шифрования RC4


Алгоритм потокового шифрования 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)
{
	int i, buffer_len;
	unsigned char x;
	unsigned char rc4_trash[RC4_SKIP_TRASH + 256];
	prepare_rc4_key(key_data_ptr, key_data_len, &rc4_key_table);
	x = RC4_SKIP_EXTRA;
	for(i = 0; i < key_data_len; i++) x = x + key_data_ptr[i];
	buffer_len = RC4_SKIP_TRASH + x;
	encrypt_buffer(rc4_trash, buffer_len);
}

Вызов в процедуре make_crypt_key_table процедуры encrypt_buffer для «кодирования» буфера rc4_trash размером RC4_SKIP_TRASH байт фактически представляет собой игнорирование некоторого количества начальных байт шифра RC4, которые в современной криптографии считаются «недостаточно надежными». И хотя мы не считаем эти соображения серьезными (особенно благодаря наличию в нашей системе мощного модуля предварительного кодирования), мы все же решили сделать эту уступку доминирующей на данный момент среди криптографов позиции. Конкретное значение RC4_SKIP_TRASH нами не публикуется, тем более что оно может меняться в зависимости от пожеланий конкретного клиента.

Случайная вариация количества отбрасываемых начальных байт шифра RC4 через суммирование криптографически случайных байт ключа RC4 по модулю 256 (переменная unsigned char x) обеспечивает дополнительную защиту от взлома хакерами потокового шифрования сеанса связи, обеспечиваемого данным модулем. Поскольку в каждом новом сеансе связи ключ RC4 всякий раз будет иным, то и количество отбрасываемых байт ключевого потока тоже всякий раз будет различаться.

Сокрытие нами конкретных значений RC4_SKIP_TRASH и RC4_SKIP_EXTRA в этом модуле не противоречит принципу Керкгоффса, поскольку эти параметры не относятся к коду (который здесь целиком опубликован), а являются, в нашем понимании, ключевыми данными. Сокрытие этих значений создает дополнительные проблемы хакерам для взлома нашей системы, к чему мы как раз и стремимся. Для оценки же криптографической стойкости нашего продукта независимыми экспертами, считаем достаточным указать, что значение RC4_SKIP_TRASH всегда превышает в нашем продукте число 500, а значение RC4_SKIP_EXTRA всегда больше 0 и всякий раз меньше, чем 255.

Контент этой страницы доступен также на английском, французском, немецком, португальском, испанском, итальянском и украинском языке.


© Extra Systems, 2024 Extra Web Top