Взлом
Уважаемые гости! При посещении нашего сайта просим вас ознакомиться с разделами форума, прежде чем оставлять ваши объявления и т.п., а также при обращении за помощью просим быть внимательными: на сайте есть как проверенные специалисты, так и непроверенные. Если вы обратились к специалисту, который проверку НЕ проходил, рекомендуем воспользоваться услугой гарант-сервиса. Спасибо, что посетили форум хакеров.

Python взлом криптографической хеш-функции через BruteForce

bbc_Hash

Модератор
Команда форума
Пользователь
Регистрация
8 Янв 2019
Сообщения
527
Реакции
71
Баллы
118
[SIZE=12pt]В этой статье мы разберём код программы на Python 3.6 с использованием BruteForce для взлома криптографической хеш-функции.[/SIZE]
[SIZE=12pt]Всё, что нам необходимо знать, чтобы сделать перебор по словарю, – это алгоритм хеш-функции, с помощью которого зашифрована информация (в нашем случае – простой текст). В программе будем использовать три алгоритма из библиотеки hashlib: md5, sha256, sha512. Вы можете усовершенствовать код, добавив в него другие алгоритмы, представленные в hashlib.[/SIZE]



[SIZE=20pt]Работа с командной строкой[/SIZE]
[SIZE=12pt]Чтобы вызвать программу, перейдём в папку, где лежит исходник (main.py), словарь (будем использовать rockyou.txt) и файл с хеш-функцией (назовём его hash.txt). Аргументы командной строки имеют следующий вид:[/SIZE]
  • [SIZE=12pt]Нулевой аргумент (необязателен)[/SIZE]
  • [SIZE=12pt]Название алгоритма шифрования[/SIZE]
  • [SIZE=12pt]Имя файла с хеш-функцией (hash.txt)[/SIZE]
  • [SIZE=12pt]Имя словаря (rockyou.txt)[/SIZE]
[SIZE=12pt]К примеру, вызов программы с использованием алгоритма md5 будет выглядеть так:[/SIZE]
[SIZE=12pt]./main.py md5 hash.txt rockyou.txt[/SIZE]
[SIZE=20pt]Разбираем код для взлома хеш-функции[/SIZE]
[SIZE=12pt]Код небольшой, поэтому я помещу его здесь, а дальше буду разбирать по строкам.[/SIZE]
[SIZE=12pt]# Examples:[/SIZE]
[SIZE=12pt]# md5: fc5e038d38a57032085441e7fe7010b0 = helloworld[/SIZE]
[SIZE=12pt]# sha256: 3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb = something[/SIZE]
[SIZE=12pt]# sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 = hello[/SIZE]

[SIZE=12pt]from sys import argv[/SIZE]
[SIZE=12pt]from hashlib import sha256, sha512, md5[/SIZE]

[SIZE=12pt]# chmod +x main.py[/SIZE]
[SIZE=12pt]# ./main.py md5 hash.txt rockyou.txt[/SIZE]

[SIZE=12pt]line = "----------------------------------"[/SIZE]

[SIZE=12pt]try:[/SIZE]
[SIZE=12pt] hashAlgr,fileHash,fileDict = argv[1],argv[2],argv[3][/SIZE]
[SIZE=12pt]except IndexError:[/SIZE]
[SIZE=12pt] print("Error: Arguments!")[/SIZE]
[SIZE=12pt] raise SystemExit[/SIZE]

[SIZE=12pt]with open(fileHash) as file:[/SIZE]
[SIZE=12pt] hashFunc = file.read()[/SIZE]
[SIZE=12pt] hashFunc = hashFunc.replace('\n','')[/SIZE]

[SIZE=12pt]def generator(string):[/SIZE]
[SIZE=12pt] for word in string:[/SIZE]
[SIZE=12pt] passwd = word.replace('\n','')[/SIZE]
[SIZE=12pt] if encrypt(passwd) == hashFunc:[/SIZE]
[SIZE=12pt] yield line +"\n[True]: "+passwd[/SIZE]
[SIZE=12pt] return[/SIZE]
[SIZE=12pt] else:[/SIZE]
[SIZE=12pt] yield "[False]: "+passwd[/SIZE]

[SIZE=12pt]def encrypt(string):[/SIZE]
[SIZE=12pt] passwd = string.encode()[/SIZE]
[SIZE=12pt] if hashAlgr == "md5":[/SIZE]
[SIZE=12pt] signature = md5(passwd).hexdigest()[/SIZE]
[SIZE=12pt] elif hashAlgr == "sha256":[/SIZE]
[SIZE=12pt] signature = sha256(passwd).hexdigest()[/SIZE]
[SIZE=12pt] elif hashAlgr == "sha512":[/SIZE]
[SIZE=12pt] signature = sha512(passwd).hexdigest()[/SIZE]
[SIZE=12pt] else: raise SystemExit[/SIZE]
[SIZE=12pt] return signature[/SIZE]

[SIZE=12pt]print(line)[/SIZE]
[SIZE=12pt]with open(fileDict, errors = "ignore") as dictionary:[/SIZE]
[SIZE=12pt] for password in generator(dictionary):[/SIZE]
[SIZE=12pt]print(password)[/SIZE]
[SIZE=12pt]print(line)[/SIZE]
[SIZE=12pt]Первым делом из библиотеки sys импортируем argv, чтобы работать с программой из командной строки. Затем из библиотеки hashlib импортируем алгоритмы, которые будем использовать – sha256, sha512, md5 (строки 6 и 7).[/SIZE]
[SIZE=12pt]В строке 12 добавляем линию, которая будет отображаться при выводе найденной фразы (сделано для красоты).[/SIZE]
[SIZE=12pt]В строках 14-18 инициализируем аргументы и проверяем их кол-во. Если при вводе в командную строку не обнаруживается какой-либо аргумент, выводится ошибка, а программа прекращает работу.[/SIZE]
[SIZE=12pt]Если не вывелось никакой ошибки, то на строках 20-22 открываем файл с хеш-функцией (hash.txt) и удаляем оттуда перенос строки – \n.[/SIZE]
[SIZE=12pt]Далее идёт функция generator: она осуществляет перебор ключей по словарю. В строке 28 убираем у слова перенос строки \n и записываем в переменную passwd. Затем сравниваем зашифрованную с помощью функции encrypt строку passwd с хеш-функцией, записанной в hash.txt. Если значения совпадают, возвращаем из функции generator строку [True] и найденный ключ. Если нет, то возвращаем [False] и текущий ключ.[/SIZE]
[SIZE=12pt]Разберём функцию encrypt. В строке 34 преобразуем переданный passwd в юникод. Чтобы понять, для чего это делается, смотрите документацию к библиотеке hashlib, которую я прикрепил в начале статьи.[/SIZE]
[SIZE=12pt]В строках 35, 37 и 39 сравниваем аргумент hashAlgr, полученный из командной строки с имеющимися алгоритмами. Если не находится совпадение, программа завершается. Если аргумент соответствует одному из наших алгоритмов, то шифруем passwd с помощью алгоритма, преобразовываем в шестнадцатиричную систему и возвращаем его.[/SIZE]
[SIZE=12pt]Рассмотрим заключительный фрагмент кода. В строке 45 мы открываем словарь. Также при открытии игнорируем ошибки. Далее просто перебираем пароли через функцию generator.[/SIZE]
[SIZE=20pt]Заключение[/SIZE]
[SIZE=12pt]Логика программы довольно проста. Если вы хорошо разбираетесь в программировании, можете с лёгкостью усовершенствовать её, добавив несколько алгоритмов шифрования, например, blake2b или алгоритм, использующийся в OpenSSL. Также возможно создание посимвольного перебора для фиксированной длины, однако такой способ будет работать гораздо дольше, чем перебор по словарю, но зато шанс взломать криптографическую хеш-функцию будет гораздо выше.[/SIZE]

Написанная информация в статье несет исключительно ознакомительный характер, чтобы дать возможность пользователю обезопасить себя. Автор не несет ответсвенности за использование данной информации личных корыстных целях.
 
Яндекс.Метрика