El algoritmo de cifrado de flujo RC4 (creado por Ron Rivest en 1987) es un clásico en su campo, pero recientemente ha sido criticado debido a su vulnerabilidad en WEP y TLS. Sin embargo, un análisis cuidadoso muestra que en estos casos no era el RC4 en sí el vulnerable, sino su combinación fallida con los protocolos especificados. Quienes lo deseen pueden profundizar en los detalles ellos mismos, pero aquí solo señalaremos que las vulnerabilidades RC4 descritas en la literatura criptológica junto con WEP y TLS no tienen nada que ver con nuestro sistema, ya que esas lagunas a través de las cuales se llevó a cabo la piratería están completamente ausentes en Extra Systems Cypher Net.
La implementación del algoritmo de cifrado de flujo RC4 en nuestro sistema se realiza de la siguiente manera:
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 swapByte; 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 print_crypt_params(void) { printf("Ключ шифрования RSA: %d бит\n", RSA_KEY_BITS); printf("Ключ шифрования RC4: %d бит\n\n", PACKED_SESSION_KEY_LENTH * 8); } void make_crypt_key_table(void) { prepare_rc4_key(common_key.packed, PACKED_SESSION_KEY_LENTH, &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); }
El contenido de esta página también está disponible en inglés, francés, alemán, portugués, ucraniano y ruso.
© Extra Systems, 2024 |