Как найти ключ RC4 из расшифрованных и зашифрованных данных?
У меня есть некоторый анализ дампа в документации, показывающей кучу зашифрованных данных и полученные в результате дешифрованные данные. Используемый алгоритм объясняется (простой RC4). Единственным отсутствующим фрагментом информации является ключ, используемый для получения от зашифрованных к дешифрованным данным.
Я пишу автоматизированный тест из этого материала документации. Я мог бы выбрать какой-нибудь свой собственный ключ и воссоздать зашифрованные данные из открытого текста, но мне интересно, есть ли какой-нибудь простой способ криптоанализа, чтобы найти оригинальный ключ, который использовался для шифрования исходного набора данных.
Подход с использованием грубой силы, вероятно, возможен, поскольку ключ довольно мал, но мне гораздо интереснее узнать, существует ли какой-либо более разумный подход.
Ниже мой текущий код шифрования C (с использованием OpenSSL):
unsigned char source[16] = {
0xdb, 0xa3, 0x13, 0x30, 0x79, 0xa3, 0xcd, 0x9e,
0x48, 0xf4, 0x8f, 0x06, 0x37, 0x1b, 0x45, 0xdd};
unsigned char expected_target[16] = {
0x00, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66};
unsigned char target[16] = {};
unsigned char key[16] = {};
RC4_KEY crypt_key;
RC4_set_key(&crypt_key, 16, key);
RC4(&crypt_key, 16, source, target);
printf("key = [%02x %02x %02x %02x %02x %02x %02x %02x "
"- %02x %02x %02x %02x %02x %02x %02x %02x]\n",
key[0], key[1], key[2], key[3],
key[4], key[5], key[6], key[7],
key[8], key[9], key[10], key[11],
key[12], key[13], key[14], key[15]);
printf("source = [%02x %02x %02x %02x %02x %02x %02x %02x "
"- %02x %02x %02x %02x %02x %02x %02x %02x]\n",
source[0], source[1], source[2], source[3],
source[4], source[5], source[6], source[7],
source[8], source[9], source[10], source[11],
source[12], source[13], source[14], source[15]);
printf("target = [%02x %02x %02x %02x %02x %02x %02x %02x "
"- %02x %02x %02x %02x %02x %02x %02x %02x]\n",
target[0], target[1], target[2], target[3],
target[4], target[5], target[6], target[7],
target[8], target[9], target[10], target[11],
target[12], target[13], target[14], target[15]);
printf("expected_target = [%02x %02x %02x %02x %02x %02x %02x %02x "
"- %02x %02x %02x %02x %02x %02x %02x %02x]\n",
expected_target[0], expected_target[1], expected_target[2], expected_target[3],
expected_target[4], expected_target[5], expected_target[6], expected_target[7],
expected_target[8], expected_target[9], expected_target[10], expected_target[11],
expected_target[12], expected_target[13], expected_target[14], expected_target[15]);
1 ответ
Нет. Эффективных методов взлома RC4 не известно.
Вам нужны миллионы лет, чтобы перебрать 128-битный ключ. Вы можете попробовать использовать списки паролей.