Предупреждение: длинный ответ
Я думаю, что во всех этих ответах отсутствует очень важное свойство криптографических хеш-функций: не только невозможно вычислить исходное сообщение, которое было хешировано, чтобы получить данный хеш, но и невозможно вычислить любой сообщение, которое хэширует данное хеш-значение. Это называется сопротивлением прообразу .
(Под «невозможным» - я имею в виду, что никто не знает, как сделать это за меньшее время, чем требуется, чтобы угадать каждое возможное сообщение, пока вы не угадаете то, которое было хэшировано в ваш хэш.)
(Несмотря на распространенное мнение о ненадежности MD5, MD5 по-прежнему устойчив к прообразам. Любой, кто не верит мне, волен давать мне все, что хэширует до 2aaddf751bff2121cc51dc709e866f19
. Что MD5 не имеет, это сопротивление столкновению , что является чем-то совершенно другим.)
Теперь, если единственная причина, по которой вы не можете «работать в обратном направлении» в криптографической хеш-функции, заключается в том, что хеш-функция отбрасывает данные для создания хеш-функции, то это не гарантирует устойчивость к прообразу: вы все равно можете «работать в обратном направлении», и просто вставляйте случайные данные в тех случаях, когда хеш-функция отбрасывает данные, и, хотя вы не получите исходное сообщение, вы все равно получите сообщение, которое хэширует желаемое значение хеш-функции. Но ты не можешь.
Так возникает вопрос: а почему бы и нет? (Или, другими словами, как вы делаете функцию устойчивой к прообразу?)
Ответ заключается в том, что криптографические хеш-функции имитируют хаотические системы. Они принимают ваше сообщение, разбивают его на блоки, смешивают эти блоки вокруг, взаимодействуют между собой некоторые блоки, смешивают эти блоки и повторяют это много раз (ну, одна криптографическая хеш-функция делает это; другие имеют свои собственные методы). Поскольку блоки взаимодействуют друг с другом, блок C должен не только взаимодействовать с блоком D, чтобы создать блок A, но он должен взаимодействовать с блоком E, чтобы создать блок B. Теперь, конечно, вы можете найти значения блоков C, D, E, который произведет блоки A и B в вашем хэш-значении, но когда вы вернетесь дальше, внезапно вам понадобится блок F, который взаимодействует с C, чтобы сделать D, и с E, чтобы сделать B, и ни один такой блок не может сделать оба в в то же время! Вы, должно быть, догадались, неправильные значения для C, D и E.
Хотя не все криптографические хеш-функции в точности соответствуют описанному выше для взаимодействия с блоками, у них одна и та же идея: если вы попытаетесь «работать в обратном направлении», вы получите множество тупиков и время, необходимое для того, чтобы вы попробовали достаточное количество значений для генерации прообраза, составляет от нескольких сотен до миллионов лет (в зависимости от хеш-функции), не намного лучше, чем время, которое требуется, чтобы просто попробовать сообщения, пока не найдете то, что работы.