Есть ли способ отменить crypt () в c? - PullRequest
8 голосов
/ 21 июля 2009

Не уверен, что это возможно, но я хочу иметь возможность начать со строки, а затем выяснить, какой ввод должен быть в crypt, чтобы вывести эту строку.

Или, может быть, это невозможно, и в этом вся цель всего этого?

Да, в коде есть соль, где я пытаюсь это сделать.

Ответы [ 7 ]

14 голосов
/ 22 июля 2009

По замыслу crypt() является односторонним хешем. Как все говорили, это означает, что намерение состоит в том, что в вычислительном отношении было бы невозможно вычислить строку открытого текста, которая выдает тот же хеш.

На это конструктивное намерение влияют несколько факторов.

  1. Вычисление на лот дешевле, чем было при проектировании crypt(). Хуже того, скорость, с которой вычисления стали дешевле, не ожидалась, поэтому сейчас она намного дешевле, чем можно было предположить.

  2. DES не удержался так, как считалось. Однако в то время это был, пожалуй, лучший выбор, учитывая общественное состояние знаний.

  3. Даже если вычисления еще не настолько дешевы, чтобы сделать свой собственный взлом, облачное хранилище в Интернете уже проделало большую работу за вас. Люди вычисляют и публикуют Радужные таблицы , которые позволяют сократить объем вычислений, необходимых для обращения к конкретному хешу. ( У Джеффа тоже был пост в блоге на радужных столах .) Соль помогает защитить от радужных столов (потому что вам потребуется набор таблиц для каждого возможного значения соли), но размер соли, используемой в Классическая реализация crypt() составляет всего 12 бит, так что это не такой большой блок, как можно было бы надеяться.

Что еще хуже, для некоторых ценных хеш-функций (например, LM-хэш , изобретенный для старых паролей Microsoft Lan Manager, но используемый для коротких паролей во всех версиях Windows до Vista), почти полные словари хешей и их обратные существуют.

4 голосов
/ 21 июля 2009

Если это старая реализация crypt(3), использующая DES, то вы можете почти (но не совсем) перебором.

В этой схеме ввод усекается до 8 символов, а каждого символа - до 7 бит, что означает наличие 56-битного пространства различных паролей для поиска.

Только для DES вы можете выполнить поиск всего пространства за 18 дней на FPGA стоимостью 10 тыс. Долл. (http://en.wikipedia.org/wiki/Data_Encryption_Standard#Brute_force_attack),, поэтому ожидаемое время составляет 9 дней. Но я предполагаю, что у вас нет 10 тыс. Долл. потратить на эту проблему еще несколько лет, и кто знает, будут ли взломщики DES работать в приемлемое время на графическом процессоре ПК.

Уже тогда crypt(3) традиционно включает 25 раундов DES, с небольшими модификациями алгоритма, основанного на соли, так что вы ожидаете, что он будет как минимум в 25 раз медленнее, чем грубая сила.

Более новые реализации crypt(3) выходят за рамки грубой силы, поскольку они основаны на лучших алгоритмах хеширования, чем алгоритм на основе DES, который использовался старым crypt(3).

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

2 голосов
/ 21 июля 2009

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

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

См. Также эту статью на slashdot .

Заключение: соль уменьшит вероятность обнаружения этой конкретной зашифрованной строки в сети, правда, но Google безразлично к любому количеству соли и все равно может помочь, если вам повезет (как это было дело, которое я дал).

1 голос
/ 21 июля 2009

номер

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

Изменено в комментариях.

0 голосов
/ 21 июля 2009

Эта функция, являющаяся односторонней, является основой любой схемы паролей в мире. Если кто-нибудь здесь ответит «да, и вот как ...», правительство будет вынуждено немедленно удалить их комментарий, сожечь их дом и увезти их в неизвестное место.

Короче, нет.

0 голосов
/ 21 июля 2009

Нет, это невозможно, взгляните на этот сайт (если вы используете библиотеку GNU C) http://www.gnu.org/s/libc/manual/html_node/crypt.html

Способ соления склепа в значительной степени гарантирует, что то, что вы пытаетесь сделать, не сработает.

0 голосов
/ 21 июля 2009

Нет .. это односторонняя функция.

...