Как сделать коллекцию для атаки Meet-In-The-Middle? - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу создать коллекцию, которую можно использовать для поиска совпадений среди значений.Как вы правильно знаете, восстановление ключа для Double DES занимает три шага.Наличие открытого текста и зашифрованного текста:

  1. Шифрование открытого текста всеми 2 ^ 56 возможными ключами и сохранение результатов
  2. Расшифровка зашифрованного текста всеми 2 ^ 56 возможными ключами и сохранениерезультаты
  3. Проверка совпадения результатов для извлечения ключа

Что я пытаюсь сделать: в настоящее время я работаю с атакой "Встреча в середине" на Double DES, и яЯ пришел к точке, где я должен зашифровать / дешифровать открытый текст / зашифрованный текст 2 ^ 56 раз и сохранить результаты, чтобы найти совпадения.

Прямо сейчас я сохранил результаты в двух HashMaps, где я храню используемый ключ и результат шифрования / дешифрования.Однако я не могу понять, как я могу сравнить результаты двух HashMaps и затем решить, какие ключи были использованы.

Итак, моя вторая идея, возможно, заключается в использовании ListMultimap вместоЯ могу сохранить результаты шифрования / дешифрования с использованным ключом, но опять же, я не знаю, как найти совпадения.Совпадения не обязательно находятся в одной строке.

РЕДАКТИРОВАТЬ:

Я попробовал с двумя HashMaps, но у меня ничего не получилось, т.е. я не смог сравнить Карты

for (int i = 0; i <  Math.pow(2, 20); i++) {

    for (int j = 0; j < Math.pow(2, 20); j++) {

        if(hmap1.values().toArray()[i].equals(hmap2.values().toArray()[j]) )    
             System.out.println(hmap1.keySet().toArray()[i] + " = " + hmap2.keySet().toArray()[i] );    
        }
 }

Я забыл упомянуть, что ради тестирования я работаю с ключами, которые имеют 20 эффективных битов.Таким образом, будет 2 ^ 20 возможных ключей

Я также забыл упомянуть, что содержат мои HashMaps.Они содержат два байтовых массива static Map<byte[], byte[]> hmap1 = new HashMap<byte[], byte[]>();, где первый байтовый массив содержит возможный ключ, а второй массив содержит результат шифрования / дешифрования

1 Ответ

0 голосов
/ 22 ноября 2018

Вот основная схема:

Вы получаете пару открытого и зашифрованного текста (P, C), которая, как вы знаете, является результатом Double DES:

C = DES k2 (DES k1 (P))

В настоящее время вы создаете, скажем, HashMap, который отображает промежуточный вывод DES на ключ DES k1, который его создал.Так что это важно: не путайте HashMap keys и DES keys , это просто неудачная перегрузка имени.Чтобы избежать путаницы, я назову ключи DES cryptokeys .Таким образом, HashMap - это из 64-битных выходов DES до 56-битных (или 20-битных в случае вашей игрушки) криптографических ключей DES.

псевдо-код Java:

Map<Long, CryptoKey> forwardMap = new HashMap();
for (CryptoKey k1=0; k1 < (1 << 20); k1++) {
    Long intermediateCipher = DES-Encrypt(k1, P);
    forwardMap.put(intermediateCipher, k1);
}

Теперь для запуска атаки в Java псевдо-код:

for(CryptoKey k2=0; k2 < (1 << 20); k2++) {
    Long intermediateCipher = DES-Decrypt(k2, C);
    if (forwardMap.contains(intermediateCipher)) {
        k1 = forwardMap.get(intermediateCipher);
        System.out.printf("k1=%s, k2=%s work", k1.toString(), k2.toString());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...