Openssl Message Digest Односторонняя атака грубой силы
Я изучаю криптографию и использую OPENSSL для реализации всего, что я изучаю. Недавно я нашел один из заданий и пытаюсь его решить. У меня нет проблем с пониманием большинства вопросов, кроме этого.
4 Задача 2: одностороннее свойство против свойства без столкновений В этой задаче мы исследуем разницу между двумя свойствами общих хеш-функций: одностороннее свойство и свойство без столкновений. Мы будем использовать метод грубой силы, чтобы увидеть, сколько времени потребуется, чтобы нарушить каждое из этих свойств. Вместо использования инструментов командной строки openssl, вы должны написать свою собственную C-программу для вызова функций дайджеста сообщений в криптографической библиотеке openssl. Документы можно найти по адресу http://www.openssl.org/docs/crypto/EVP_DigestInit.html. Лаборатория обучения компьютерной безопасности, CMSC 414, весна 2013 г. 2 Поскольку большинство хеш-функций достаточно сильны против атаки с использованием грубой силы на эти два свойства, нам понадобятся годы, чтобы сломать их, используя метод грубой силы. Чтобы сделать задачу выполнимой, во всем этом проекте мы сократили длину хеш-значения до 24 бит. Мы можем использовать любую однонаправленную хеш-функцию, но мы используем только первые 24 бита хеш-значения. Напишите программу, которая при 24-битном хэш-значении находит соответствующий текст (только строчные символы ASCII). Ваша программа должна будет многократно 1) генерировать случайный текст, 2) хэшировать его, 3) сравнивать младшие 24 бита со входом. Ваша программа (источник должен называться task2.c) будет вызываться следующим образом:
./task2 <digest name> <hash value>
например,
./task2 sha256 2612c7. . .
и ваша программа должна записать выигрышный текст в task2.out. Пожалуйста, убедитесь, что вывод доступен для чтения и записи, т.е.
open("task2.out", O`enter code here` WRONLY | O CREAT, 0644);
Мы проверим с помощью инструментов командной строки, например,
openssl dgst -sha256 task2.out
, Вопрос: Сколько текстов вам нужно было хешировать, чтобы найти конкретный хеш? (дать в среднем три испытания)
Я не могу понять, как начать писать свою программу. Любые вклады с благодарностью. Поскольку я не решаю это для домашней работы. Я ищу некоторые указатели, а не код.
2 ответа
Ну, читая мне текст, понятно, в чем заключается задача, и неясно, какую часть вы не получите. Когда начать?
- создайте скелетную программу, как привет слово
- создать функцию, которая генерирует случайный текст
- создайте функцию, которая принимает текст и хеш-идентификатор, и использует openssl для его хеширования, возвращая хеш
- создать функцию, которая извлекает младшие 24 бита хеша
- создайте функцию, которая принимает параметры командной строки и конвертирует их в 24-битное число, которое является искомым хешем и хеш-идентификатором для сброса в openssl (или завершается с индикацией ошибки)
- запустить цикл, который продолжает подавать новые случайные строки, пока результирующий хеш не совпадет с req и не подсчитает
- записать выигрышный текст в файл и номер для вывода
- выполнить все оставшиеся задачи из задания...
Алгоритм хорошо изложен Balog Pal. Просто добавим несколько вещей: в одностороннем свойстве вам дается хеш, и вы ищете другой текст с похожим хешем. В свойствах без столкновений вам просто нужно найти два текста с похожими хэшами. Итак, вы начинаете с создания двух текстов и сравниваете их соответствующие хеши. Если они одинаковы, вы обнаружили столкновение. Если нет, вы сохраняете уже сгенерированные хеши, а затем генерируете новый текст, находите его хеш и сравниваете его с сохраненными хешами. если с ним совпадает какой-либо сохраненный хеш, вы обнаружили столкновение, иначе сохраните его в списке сохраненных хешей. Повторяйте цикл, пока не найдете столкновение.
Реализация того же Python может быть найдена по ссылке ниже. Он включает в себя минимум комментариев, поэтому вы должны выяснить все из кода. Как только это будет сделано, попробуйте реализовать его в C или Java.