Предупреждение: Длинный ответ
Я думаю, что все эти ответы не хватает очень важное свойство криптографические хэш-функции: не только невозможно вычислить исходное сообщение, которое было хэш, чтобы получить данный хэш, невозможно вычислить любое сообщение, которое будет использовать хэш для заданного значения хэш-функции. Это называется Профилактическое сопротивление.
(К «невозможно» - я имею в виду, что никто не знает, как это сделать за меньшее время, чем требуется, чтобы угадать все возможные сообщения, пока вы не угадать тот, который был хэш в ваш хэш.)
(Несмотря на популярная вера в неуверенность MD5, MD5 по-прежнему устойчив к прообразу. Любой, кто мне не верит, может дать мне все, что хеширует до 2aaddf751bff2121cc51dc709e866f19
. Что MD5 не имеет, это collision resistance, что совсем другое.)
Теперь, если единственная причина, по которой вы не можете «работать назад» в криптографической хэш-функции, была связана с тем, что хеш-функция отбрасывается данные для создания хэша, то это не гарантирует сопротивления провидения: вы все равно можете «работать назад» и просто вставлять случайные данные везде, где хеш-функция отбрасывает данные, и, хотя вы не придумали оригинальное сообщение, вы бы по-прежнему появляется сообщение о том, что хэши имеют желаемое значение хэш-функции. Но вы не можете.
Таким образом, вопрос становится следующим: почему бы и нет? (Или, другими словами, как вы делаете функцию прообразом устойчивой?)
Ответ заключается в том, что криптографические хэш-функции имитируют хаотические системы. Они берут ваше сообщение, разбивают его на блоки, смешивают эти блоки вокруг, блокируют некоторые из блоков, смешивают эти блоки вокруг и повторяют это много раз (ну, одна криптографическая хэш-функция делает это, другие имеют свои собственные методы). Поскольку блоки взаимодействуют друг с другом, блок C не только должен взаимодействовать с блоком D, чтобы создать блок A, но он должен взаимодействовать с блоком E, чтобы создать блок B. Теперь, конечно, вы можете найти значения блоков C, D, E, который будет генерировать блоки A и B в вашем хеш-значении, но по мере того, как вы идете дальше назад, вам понадобится блок F, который взаимодействует с C, чтобы сделать D, а с E сделать B, и такой блок не может делать как в в то же время! Вы должны были угадать неправильные значения для C, D и E.
Хотя не все криптографические хеш-функции точно так же, как описано выше, с блочным взаимодействием, они имеют одинаковую идею: если вы попытаетесь «работать назад», вы «В конце концов, у вас будет много тупиков, и время, затрачиваемое на то, чтобы вы пробовали достаточные значения для создания прообраза, составляет порядка от сотен до миллионов лет (в зависимости от хэш-функции), не намного лучше чем время, которое потребовалось бы, чтобы попробовать сообщения, пока не найдете тот, который работает.
Я не видел вашего редактирования. Думаю, вы подвели это в этих двух пулях. –
Да, «консенсус» в ответах на [вопрос, который вы связали] (http://stackoverflow.com/questions/330207/how-come-md5-hash-values-are-not-reversible) совершенно неверен. Я просто добавил еще один ответ, исправляющий это. –
Причина, по которой свойство обратимости не является «бесконечным количеством входных строк», должно также иметь место, когда вы ограничиваете ввод чем-то небольшим (например, по размеру вывода). –