Алгоритм потокового шифрування RC4 (створений Роном Рівестом у 1987 році) є класикою у своїй галузі, але останнім часом він наражався на критику у зв'язку зі своєю вразливістю у WEP та TLS. Однак уважний аналіз доводить, що в цих випадках уразливим був не сам RC4, а його невдале використання у поєднанні із зазначеними протоколами. Хто цього бажає, той може сам заглибитися в подробиці, ми ж тут лише зазначимо, що описані в криптологічній літературі вразливості RC4 у зв'язці з WEP і TLS до нашої системи жодного відношення не мають, оскільки ті лазівки, через які там робився злом, у Extra Systems Cypher Net геть-чисто відсутні. На відміну від тих, хто свого часу невдало використовував протокол RC4 у WEP і TLS, ми дійсно здатні застосовувати його у нашій системі цілком безпечно.
Реалізація алгоритму потокового шифрування 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 |
|