Как найти ключ 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]);

person kriss    schedule 17.09.2012    source источник
comment
Грубая сила? А если серьезно, то весь смысл шифрования в том, чтобы сделать такие вещи вычислительно сложными.   -  person Jonathan Grynspan    schedule 17.09.2012
comment
Мне непонятно. Я полагал, что с вычислительной точки зрения было сложно найти какой-то неизвестный открытый текст по зашифрованному тексту. В моем случае у меня есть как зашифрованный текст, так и открытый текст. Мне неясно, что это та же проблема (но грубая сила действительно не может быть вариантом).   -  person kriss    schedule 17.09.2012
comment
Это та же проблема. Известный открытый текст упрощает определенные атаки, но в случае RC4 такие атаки неизвестны. Извините, но если вы не знаете ключ, то вы SOL.   -  person Jonathan Grynspan    schedule 17.09.2012


Ответы (1)


  1. Нет. Эффективных методов взлома RC4 не известно.

  2. Вам нужны миллионы лет, чтобы взломать 128-битный ключ. Вы можете попробовать использовать списки паролей.

person Pavel Ognev    schedule 17.09.2012
comment
поскольку я знаю, что ключ, вероятно, будет случайным числом, список паролей отсутствует. Но я не уверен, что то, что я ищу, действительно взламывает RC4, так как у меня уже есть открытый текст (возможно, это так или иначе, но меня все еще интересуют указатели, объясняющие, почему). - person kriss; 17.09.2012
comment
Если ключ действительно случайный, у вас нет шансов. RC4 теперь не сломан. Модель атаки по известному открытому тексту не является исключением. - person Pavel Ognev; 17.09.2012
comment
Кроме того, если у вас есть старая реализация RC4 (думаю, нет), вы можете попробовать Fluhrer, Mantin и атака Шамира - person Pavel Ognev; 17.09.2012