2012-03-23 3 views
2

Мне интересно, можно ли найти блок текста, который бы присвоил хэш известному значению. В частности, я ищу для функции CreateDataFromHash(), которую можно назвать следующим образом:Есть ли библиотека, которая создавала бы строку, которая бы хэш (SHA1) для данного входа?

unsigned char myHash[] = "da39a3ee5e6b4b0d3255bfef95601890afd80709"; 
unsigned int length = 10000; 
CreateDataFromHash(myHash, length); 

Здесь CreateDataFromHash возвратит строку длиной 10000, содержащий произвольные данные, которые бы хэш myHash с помощью SHA1.

Спасибо.

+1

Если бы был способ сделать это за разумные промежутки времени, шифрование не помогло бы. – Collin

+13

Хорошая попытка, NSA. Вам просто нужно будет провести собственное исследование. – mkb

+0

Вы должны переборщить его. См. . http://stackoverflow.com/questions/7031288/php-brute-force-password-generator –

ответ

5

В общем, нет простого или даже умеренно трудного способа сделать это.

Весь смысл хэшей (или так называемый one-way functions) состоит в том, что их легко вычислить, но практически невозможно отменить их вычисления (найти входные значения на основе вывода). Тем не менее, для некоторых хеш-функций существуют известные методы, которые могут позволить вычислять входные данные для заданного хеш-значения в разумные сроки.

Например, этот MD5 sum technique найдет столкновение (но не вход для данного выхода) примерно через 8 часов на компьютере с частотой 1,6 ГГц.

Для SHA-1 в частности вас может заинтересовать reading this.

2

Одна из целей SHA1 заключается в том, что это очень сложно сделать.

+0

Есть ли какие-либо * другие цели алгоритма хэширования? – jalf

+0

Хорошо хранить пароли - это не единственное использование хешей. –

+0

Да, но все виды использования хешей зависят от того, что они не могут вызвать столкновения. – jalf

1

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

+1

Речь идет не о возврате оригинального ввода. –

+1

Но если бы вы могли, это было бы неплохое сжатие. – devsnd

+0

Уверен, что вы можете получить входной сигнал от выхода, когда-либо слышал о таблицах Rainbow? http://en.wikipedia.org/wiki/Rainbow_table –

0

Вы должны переборщить его. См

PHP brute force password generator

Получить строку, сделать хэш, сравнить, повторите

+1

Или google hash string и посмотрите, кто-то уже это сделал: P – jcoder

1

Это будет "прообразом атака". Ни одна такая вещь не известна публично против SHA-1.

Единственная атака, известная против SHA-1, - это атака столкновения. Это означает, что я нахожу два входа, которые дают один и тот же результат, но ни один из них не является, так сказать, заранее предопределенным. Несмотря на это, эта атака для большинства людей практически невозможна - в зависимости от количества вычислений, наиболее близким я могу понять, что вам придется потратить где-то в пределах нескольких миллионов долларов, чтобы построить машину, которая даст вам одну встречную пару ключей в неделю (при условии, что она побежала, ничего больше не делала 24/7).

+0

Мне просто нужно добавить, это не о получении правильной строки данных. Но мабби не имеет значения, когда дело доходит до времени? – user1188404

+0

@ user1188404: Да - получение исходной строки назад даже теоретически невозможно, кроме как случайно. Это просто поиск * * * пары входов, которые дают один и тот же результат (фактически, встречные пары, которые найдены, обычно имеют длину всего несколько байтов). –

Смежные вопросы