Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Подбор части пароля перебором (brute force attack) по маске и sha-256

#python #python_3x #криптография #хеширование


У меня есть кусок пароля *elp** (вместо звездочек должны быть символы, которые надо
подобрать), но я знаю от него sha256 хеш: 

fda23a72c73c92a1ad61cd18c58961b90c2c127028c8b87fd1a65c5e1f55d17e


Мне надо подобрать из всей этой информации к нему пароль
(если что, пароль helpMe)

я написала кусок программы и не знаю как сделать дальше 

import hashlib
mas = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","1","2","3","4","5","6","7","8","9","0"]

a = b'Hello'
sha = hashlib.sha256(a).hexdigest()

print(sha) 

    


Ответы

Ответ 1



Попробуйте так: import string import hashlib from itertools import product def brute_force(mask, hsh, alphabet=string.ascii_letters+string.digits, verbose=False): # экранируем фигурные скобки # и заменяем '*' на '{}' для последующей подстановки в 'str.format()' pwd_pat = mask.replace('{', '{{').replace('}','}}').replace('*', '{}') # число звездочек - будем использовать в качестве `product(.., repeat)` N = mask.count('*') i = 0 for chars in product(alphabet, repeat=N): if verbose: i += 1 if i % 10000 == 0: print('Iterations: {}'.format(i)) if hsh == hashlib.sha256(pwd_pat.format(*chars).encode()).hexdigest(): return pwd_pat.format(*chars) return None Тест: hsh = 'fda23a72c73c92a1ad61cd18c58961b90c2c127028c8b87fd1a65c5e1f55d17e' In [245]: brute_force('*elp**', hsh, verbose=True) Iterations: 10000 Iterations: 20000 Out[245]: 'helpMe'

Ответ 2



Вариант, который работает с байтами и использует все доступные CPU: #!/usr/bin/env python3 import hashlib import itertools import multiprocessing import string from functools import partial alphabet = string.ascii_lowercase.encode() def sha256(data): return hashlib.sha256(data).digest() def check_sha256(repls_parent, bytes_format, n, target_sha256): for repls in itertools.product(alphabet, repeat=n): data = bytes_format % (repls_parent + repls) if sha256(data) == target_sha256: return data def brute_force(mask, target_sha256, n_cutoff=4): """ n_cutoff -- number of `*` to process in a worker process """ bytes_format = mask.replace(b'%', b'%%').replace(b'*', b'%c') mp_check = partial(check_sha256, bytes_format=bytes_format, n=min(n_cutoff, mask.count(b'*')), target_sha256=target_sha256) n = max(0, mask.count(b'*') - n_cutoff) all_repls_parent = itertools.product(alphabet, repeat=n) with multiprocessing.Pool() as pool: for data in pool.imap_unordered(mp_check, all_repls_parent): if data is not None: return data Пример: import binascii sha256_hex = b'c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a' passw_bytes = brute_force(b'******t horse battery staple', binascii.unhexlify(sha256_hex)) print(passw_bytes.decode()) Задача распараллеливается, делегированием генерации n_cutoff замен в дочерние процессы. Задача подходит для вычисления на GPU. Из-за связи sha256 с Bitcoin mining существуют ASIC, заточенные под вычисление хэшей. Чтобы отслеживать прогресс, можно tqdm модуль использовать: from tqdm import tqdm #... all_repls_parent = itertools.product(alphabet, repeat=n) with multiprocessing.Pool() as pool: for data in tqdm(pool.imap_unordered(mp_check, all_repls_parent), total=len(alphabet)**n): if data is not None: return data

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

Отправить комментарий