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

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости

Новостная лента форума ailab.ru


В этой статье мы разберём код программы на Python 3.6 с использованием BruteForce для взлома криптографической хеш-функции.

Всё, что нам необходимо знать, чтобы сделать перебор по словарю, – это алгоритм хеш-функции, с помощью которого зашифрована информация (в нашем случае – простой текст). В программе будем использовать три алгоритма из библиотеки hashlib: md5, sha256, sha512. Вы можете усовершенствовать код, добавив в него другие алгоритмы, представленные в hashlib. Документацию по библиотеке можете найти здесьздесь и здесь.

хеш-функции

Работа с командной строкой

Чтобы вызвать программу, перейдём в папку, где лежит исходник (main.py), словарь (будем использовать rockyou.txt, скачать его можно здесь) и файл с хеш-функцией (назовём его hash.txt). Аргументы командной строки имеют следующий вид:

  • Нулевой аргумент (необязателен)
  • Название алгоритма шифрования
  • Имя файла с хеш-функцией (hash.txt)
  • Имя словаря (rockyou.txt)

К примеру, вызов программы с использованием алгоритма md5 будет выглядеть так:
./main.py md5 hash.txt rockyou.txt

Разбираем код для взлома хеш-функции

Код небольшой, поэтому я помещу его здесь, а дальше буду разбирать по строкам.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

# Examples:

# md5: fc5e038d38a57032085441e7fe7010b0 = helloworld

# sha256: 3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb = something

# sha512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043 = hello

fromsysimportargv

fromhashlibimportsha256,sha512,md5

# chmod +x main.py

# ./main.py md5 hash.txt rockyou.txt

line="----------------------------------"

try:

hashAlgr,fileHash,fileDict=argv[1],argv[2],argv[3]

exceptIndexError:

print("Error: Arguments!")

raiseSystemExit

withopen(fileHash)asfile:

hashFunc=file.read()

hashFunc=hashFunc.replace(' ','')

defgenerator(string):

forword instring:

passwd=word.replace(' ','')

ifencrypt(passwd)==hashFunc:

yieldline+" [True]: "+passwd

return

else:

yield"[False]: "+passwd

defencrypt(string):

passwd=string.encode()

ifhashAlgr=="md5":

signature=md5(passwd).hexdigest()

elifhashAlgr=="sha256":

signature=sha256(passwd).hexdigest()

elifhashAlgr=="sha512":

signature=sha512(passwd).hexdigest()

else:raiseSystemExit

returnsignature

print(line)

withopen(fileDict,errors="ignore")asdictionary:

forpassword ingenerator(dictionary):

print(password)

print(line)

Первым делом из библиотеки sys импортируем argv, чтобы работать с программой из командной строки. Затем из библиотеки hashlib импортируем алгоритмы, которые будем использовать – sha256, sha512, md5 (строки 6 и 7).

В строке 12 добавляем линию, которая будет отображаться при выводе найденной фразы (сделано для красоты).

В строках 14-18 инициализируем аргументы и проверяем их кол-во. Если при вводе в командную строку не обнаруживается какой-либо аргумент, выводится ошибка, а программа прекращает работу.

Если не вывелось никакой ошибки, то на строках 20-22 открываем файл с хеш-функцией (hash.txt) и удаляем оттуда перенос строки –  .

Далее идёт функция generator: она осуществляет перебор ключей по словарю. В строке 28 убираем у слова перенос строки и записываем в переменную passwd. Затем сравниваем зашифрованную с помощью функции encrypt строку passwd с хеш-функцией, записанной в hash.txt. Если значения совпадают, возвращаем из функции generator строку [True] и найденный ключ. Если нет, то возвращаем [False] и текущий ключ.

Разберём функцию encrypt. В строке 34 преобразуем переданный passwd в юникод. Чтобы понять, для чего это делается, смотрите документацию к библиотеке hashlib, которую я прикрепил в начале статьи.

В строках 35, 37 и 39 сравниваем аргумент hashAlgr, полученный из командной строки с имеющимися алгоритмами. Если не находится совпадение, программа завершается. Если аргумент соответствует одному из наших алгоритмов, то шифруем passwd с помощью алгоритма, преобразовываем в шестнадцатиричную систему и возвращаем его.

Рассмотрим заключительный фрагмент кода. В строке 45 мы открываем словарь. Также при открытии игнорируем ошибки. Далее просто перебираем пароли через функцию generator.

Заключение

Логика программы довольно проста. Если вы хорошо разбираетесь в программировании, можете с лёгкостью усовершенствовать её, добавив несколько алгоритмов шифрования, например, blake2b или алгоритм, использующийся в OpenSSL. Также возможно создание посимвольного перебора для фиксированной длины, однако такой способ будет работать гораздо дольше, чем перебор по словарю, но зато шанс взломать криптографическую хеш-функцию будет гораздо выше.



Источник: proglib.io

Комментарии: