Как расшифровать Sha1-зашифрованную строку в Java - PullRequest
8 голосов
/ 12 октября 2011

Возможно ли расшифровать некоторую строку, которая была ранее зашифрована с помощью алгоритма SHA-1 в Java?

Ответы [ 3 ]

12 голосов
/ 12 октября 2011

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

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

Пример кода Python:

def crack_hash(hash_to_crack, hash_function, list_of_guesses):
    # Try to hash everything in our guess list
    for guess in list_of_guesses:
        new_hash = hash_function(guess)
        # if the hashes match, we found it
        if new_hash == hash_to_crack:
            return guess
    # If none of them match, give up
    return None

Конечно, если вы действительно хотите эффективно взламывать хэши, лучше всего использовать такие программы, как John the Ripper или Hashcat . Обратите внимание, что это обычно работает с паролями, так как они короткие и легко угадываются, но сложность возрастает экспоненциально с увеличением входных данных. Вы можете взломать каждый хэш SHA-1 с помощью 6-символьного ввода в считанные минуты, в то время как взлом одного хэша с 16 символами займет в среднем триллионы лет.

2 голосов
/ 12 октября 2011

Краткий ответ: это невозможно.

Поскольку SHA-1 - это криптографическая хеш-функция , по принципу голубиных отверстий математически невозможно изменить.Есть только 2 160 возможных хэшей SHA-1.Поскольку существует бесконечное количество возможных входных строк, должны быть коллизии (несколько входов, которые хэшируют одно и то же значение).В общем, вы никак не можете узнать, какая из этих строк была исходным вводом.

Однако строки реального мира не совсем произвольны.Если вам известна некоторая информация о вашей входной строке (например, она была длиной менее 5 символов), с большой вероятностью ввод будет уникальным.К сожалению для вас, хеш-функции, такие как SHA-1, намеренно вычислительно невозможны для инвертирования.(Есть теоретические атаки на SHA-1, но я не думаю, что какие-либо из них в настоящее время считаются даже практически осуществимыми.)

Поэтому, если вам нужно восстановить хешированные данные, вы должны использовать грубую силу: попробуйте SHA-1 каждую строку длиной менее n и посмотрите, совпадает ли хеш.Но существует экспоненциально много строк длиной до n , поэтому это быстро становится невозможным.

Существует один возможный способ восстановления хешированных данных до конца вселенной .Ваша единственная надежда - использовать более сложный метод, такой как радужные столы .Это будет только , если вы знаете, что ваша исходная строка была очень короткой (менее ~ 15 символов).Даже для коротких строк предварительное вычисление таблицы займет много времени (и гигабайт дискового пространства).

2 голосов
/ 12 октября 2011

Нет, это невозможно, потому что SHA-1 - это хэш - это билет в один конец.Если вы хотите зашифровать и расшифровать строку, то вам нужно использовать некоторый алгоритм шифрования, который использует ключ для генерации зашифрованных данных.Затем вы можете зашифровать данные и после успешно расшифровать их.Например, AES.Вы можете прочитать об AES здесь

...