Как взломать ослабленный блочный шифр TEA?

В данный момент я пытаюсь взломать блочный шифр TEA на C. Это задание, а чайный шифр был ослаблен, так что ключ представляет собой 2 16-битных числа.

Нам дали код для кодирования открытого текста с использованием ключа, а также для декодирования зашифрованного текста с помощью ключа.

У меня есть несколько примеров открытого текста:

  1. открытый текст (1234,5678) закодированный (3e08, fbab)
  2. открытый текст (6789, dabc) закодированный (6617,72b5)

Обновлять

Метод encode принимает открытый текст и ключ encode(plaintext,key1). Это происходит снова с другим ключом для создания закодированного сообщения, encode(ciphertext1,key), который затем создает закодированное (3e08,fbab) или закодированное (6617,72b5).

Как мне взломать этот шифр?

На данный момент я кодирую известный открытый текст всеми возможными ключами; размер ключа представляет собой шестнадцатеричное значение ffffffff. Я записываю это в файл.

Но теперь я застрял и нуждаюсь в направлении.


Как я мог использовать слабость эквивалентных ключей TEA, чтобы сократить время, необходимое для взлома шифра? Кроме того, я собираюсь использовать человека в средней атаке.

Как и при кодировании известным открытым текстом и всеми ключами 1, он создаст весь зашифрованный текст со связанным ключом и сохранит его в таблице.

Затем я расшифрую известным зашифрованным текстом, который есть в моем задании, со всеми возможными значениями ключа2. Это оставит меня с таблицей расшифровок, которая была расшифрована только один раз.

Затем я могу сравнить две таблицы вместе, чтобы увидеть, соответствует ли какой-либо из encrpts с key1 расшифровке с key2.

Я также хотел бы использовать слабость equilenvent, если бы кто-нибудь мог помочь мне с реализацией этого в коде, это было бы здорово. Есть идеи?


person molleman    schedule 11.11.2010    source источник


Ответы (5)


Это очень похоже на задачу Double Crypt из конкурса программирования IOI '2001. Общее решение показано здесь, оно не даст вам код, но может указать вам в правильном направлении.

person Mihai    schedule 11.11.2010
comment
хорошее дополнение, именно так, как я хочу это сделать, мне это сложно, так как я нуб в c, И ЭТО ДОЛЖНО БЫТЬ СДЕЛАНО В C - person molleman; 12.11.2010

Не записывайте свои результаты в файл — просто сравнивайте каждый созданный вами зашифрованный текст с известным зашифрованным текстом, кодируя известный открытый текст всеми возможными ключами, пока один из них не даст правильный зашифрованный текст. В этот момент вы использовали правильный ключ. Убедитесь в этом, зашифровав второй известный открытый текст тем же ключом, чтобы убедиться, что он также выдает правильный результат.

Изменить: кодирование, происходящее дважды, не имеет большого значения. Вы все еще получаете что-то вроде этого:

for (test_key=0; test_key<max; test_key++)
    if (encrypt(plaintext, test_key) == ciphertext)
        std::cout << "Key = " << test_key << "\n";

Шифрование, происходящее дважды, означает, что ваш encrypt будет выглядеть примерно так:

return TEA_encrypt(TEA_encrypt(plaintext, key), key);

Edit2: хорошо, исходя из отредактированного вопроса, вам, по-видимому, придется дважды использовать ослабленный TEA, каждый со своим 16-битным ключом. Вы можете сделать это с помощью одного цикла, как показано выше, и разделить test_key на два независимых 16-битных ключа, или вы можете сделать вложенный цикл, например:

for (test_key1=0; test_key1<0xffff; test_key1++)
    for (test_key2=0; test_key2<0xffff; test_key2++)
        if (encrypt(encrypt(plaintext, test_key1), test_key2) == ciphertext)
            // we found the keys.
person Jerry Coffin    schedule 11.11.2010
comment
я забыл добавить, кодировка происходит дважды - person molleman; 11.11.2010
comment
но это 2 разных ключа - person molleman; 11.11.2010
comment
кодировать (открытый текст, ключ1), затем кодировать (шифрованный текст, ключ2), это дает мне закодированный (3e08, fbab) или закодированный (6617,72b5) .. я отредактировал сообщение выше - person molleman; 11.11.2010
comment
ваш приведенный выше код будет распечатываться как key1 = 0001, затем key2 = 0001 и увеличиваться как key1 = 0002 key2 = 0002, этого недостаточно, поскольку он не проверяет все возможные значения двух ключей вместе: например, это не будет проверьте ключ1 = 0002 и ключ2 = 0001 - person molleman; 11.11.2010
comment
Если он собирается иметь два вложенных цикла до 2 ^ 16, то тело внутреннего цикла должно быть выполнено более 4 000 000 раз. Если на двойное шифрование и тестирование требуется, скажем, 0,0005 секунды, то общее время выполнения будет близко к часу. Я не думаю, что грубая сила - хороший выбор здесь. - person Mihai; 12.11.2010
comment
@molleman: это не так - внутренний цикл перезапускает каждую итерацию внешнего цикла, поэтому он проверяет каждую возможную комбинацию двух ключей. @Mihai: он спросил о грубой силе, вот что я ответил. В целом, я бы согласился - хотя это наполовину практично, это определенно не для разумного шифра. Большинство современных шифров используют достаточно большие ключи, поэтому грубой силы явно недостаточно. OTOH, ваша оценка кажется мне довольно высокой - полмиллисекунды для шифрования были бы действительно медленными. Я ожидаю, что TEA будет на пару порядков быстрее. - person Jerry Coffin; 12.11.2010
comment
хорошо, я собираюсь отредактировать вопрос, чтобы узнать, как я могу атаковать его, используя слабость чая к эквивалентности - person molleman; 12.11.2010
comment
@molleman: я бы сделал это как новый вопрос. Уточнение вопроса после того, как вы его задали, — это прекрасно и модно, но вносить фундаментальные изменения в то, что вы задаете, редко бывает хорошей идеей. - person Jerry Coffin; 12.11.2010

Я не уверен, справедливо ли это свойство для 16-битных ключей, но 128-битные ключи обладают тем свойством, что четыре ключа эквивалентны, что сокращает пространство поиска в четыре раза. Я не сразу помню, как найти эквивалентные ключи, только то, что ключевое пространство не так велико, как кажется. Это означает, что он подвержен атаке с использованием связанного ключа.

Вы пометили это как домашнее задание, поэтому я не уверен, есть ли здесь другие требования, например, не использовать грубую силу, что, похоже, вы пытаетесь сделать. Если бы вам пришлось пойти на атаку грубой силы, вам, вероятно, нужно было бы знать, как должен выглядеть открытый текст (например, знать его по-английски).

person Adam Miezianko    schedule 11.11.2010
comment
нет, нам не нужно знать, на английском ли это, все, что нам нужно сделать, это найти ключ - person molleman; 11.11.2010
comment
Вы имеете в виду, что вам дан открытый текст и зашифрованный текст, и вы должны определить ключ? Вы шифруете открытый текст с помощью ключа, сравните с зашифрованным текстом, не нужно записывать в файл. Или вы можете пойти в другом направлении и расшифровать зашифрованный текст, пока не найдете обычный текст. Опять же, это для решения грубой силы, и вы можете уменьшить пространство поиска, используя свойство эквивалентного ключа, хотя вам нужно знать больше об эквивалентности ключей, чем я. - person Adam Miezianko; 11.11.2010
comment
хорошо, спасибо, но еще одна вещь, о которой я не упомянул выше, это то, что открытый текст является двойным шифрованием, он отправляется через метод кодирования во второй раз с другим ключом (это имеет значение?) - person molleman; 11.11.2010

Эквивалентные клавиши достаточно просты для понимания и сокращают пространство клавиш в четыре раза. Ключ разделен на четыре части. Каждый цикл TEA состоит из двух раундов. Первый использует первые две части ключа, а второй использует 3-ю и 4-ю части. Вот схема одного цикла (двух раундов) TEA: (незарегистрированные пользователи не могут включать изображения, поэтому вот ссылка) https://en.wikipedia.org/wiki/File:TEA_InfoBox_Diagram.png

Примечание: зеленые прямоугольники — это дополнение, красные кружки — XOR.

TEA работает с блоками, которые он разбивает на две половины. Во время каждого раунда одна половина блока сдвигается на 4,0 или -5 бит влево, к ней добавляется часть ключа или константа раунда, а затем к другой половине добавляется XOR полученных значений. блока. Переворот старшего бита любого ключевого сегмента переворачивает один и тот же бит в суммах, для которых он используется, и, соответственно, в результате XOR, но не имеет другого эффекта. Изменение старшего бита обоих ключевых сегментов, используемых в цикле, дважды переворачивает один и тот же бит в продукте XOR, оставляя его неизменным. Переворачивание этих двух битов вместе не меняет результат блочного шифра, делая перевернутый ключ эквивалентным оригиналу. Это можно сделать как для (первого/второго), так и для (третьего/четвертого) ключевых сегментов, уменьшив эффективное количество ключей в четыре раза.

person Richard    schedule 04.02.2013

Учитывая (скромный) размер вашего ключа шифрования, вы можете позволить себе создать предварительно рассчитанную таблицу (используйте тот же код, что и выше, и храните данные в больших фрагментах памяти — если у вас недостаточно оперативной памяти, сбрасывайте фрагменты на диск и сохраните схему адресации, чтобы вы могли искать их в правильном порядке).

Это позволит вам охватить всю область, и поиск решения будет выполняться в режиме реального времени (поиск в одной таблице).

Тот же прием (усечение ключей) использовался (не так давно) в ведущих программах Office. Теперь они используют неслучайные данные для генерации ключей шифрования, что (в лучшем случае) приводит к тому же результату. На практике возможность знать ключи шифрования до их генерации (поскольку так называемый генератор случайных чисел предсказуем) даже более желательна, чем усечение ключей (оно приводит к тому же результату, но без необходимости создавать и хранить радужные столы).

Это называется марш прогресса...

person PierreG    schedule 11.11.2010