Познакомился с языком программирования python, решил написать дешифратор хеша sha256. Программа работает но медленно, прошу Вашего содействия для ускорения работы программы. На данный момент дает скорость 60-75кН/с и загружает только один ЦП (центральный процессор) на 50% с использованием одного ядра, не использует ГП (графический процессор).
Не знаю как применить многопоточность и многоядерность?
Как сделать чтобы программа полностью выполнялась на ГП?
Как использовать ресурсы ГП (на любой видеокарте) или ЦП на 80-90%?
Я в этой области новичок, у меня видеокарта GeForce 610M.
Вот сам код:
from hashlib import sha256 from numba import cuda import time import numpy as np import numba symbol_sha = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] len_sha = 64 begin_over = 0 limit_over = 488526937079580 check = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] empty_not = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] len_symbol = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] rehash_true = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] hash = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] rehash = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] real_hash = '' Smena = False empty_all = False check_all = False timeBegin = time.time() begin = begin_over num_hash = 9 way = 'F:\Hashing' real_rehash = '' @numba.autojit(parallel=True) #проверка введенных хешей на корректность def check_input(in_hash, j): if in_hash == '': empty_not[j] = False print('Hash', j, '=', 'Пустой') else: empty_not[j] = True if empty_not[j] == True: i = 0 q = 0 for k in in_hash: i += 1 for m in symbol_sha: if m == k: q = 0 continue else: q += 1 if q == 16: break if i == len_sha: len_symbol[j] = True else: len_symbol[j] = False print('Hash', j, '=', 'Длина ХЭШ не соответсвует или введены не 16-тиричная система') if (empty_not[j] == True) and (len_symbol[j] == True): check[j] = True print('Hash', j, '=', 'Значения верны') #сохранение открытого rehash def save_rehash(text_in, j_try): save_way = way + '\Output.txt' rehash_true[j_try] = True final_rehash = 'Hash'+j_try+'='+text_in["text"]+'\n' file = open(save_way, 'a') file.write(final_rehash) file.close() #загрузка в памать проги хэшей def add_hash(): global way, num_hash, hash if num_hash == 0: num_hash = int(input('Введите количество HASH (max = 24): ')) else: print('Количество HASH: ', num_hash) if way == '': way = str(input('Введите путь к папке Hashing: ')) else: print('Путь к папке Hashing: ', way) add_way = way + '\Input.txt' as1 = 0 as2 = 0 while as1 < num_hash: file = open(add_way, 'r') file.seek(as2) hash[as1] = file.read(len_sha) as2 = as2 + len_sha + 2 print('Hash', as1, '=', hash[as1]) as1 += 1 file.close() #загрузка промежуточного rehash def buffer_add(): global real_rehash buffer_way = way + '/buffer.txt' file = open(buffer_way, 'r') real_rehash= file.read(len_sha) if real_rehash == '': real_rehash = '0000000000000000000000000000000000000000000000000000000000000000' file.close() print('Буфер =', real_rehash) #сохранение промежуточного rehash def buffer_save(): buffer_way = way + '/buffer.txt' final_buffer = real_rehash file = open(buffer_way, 'w') file.write(final_buffer) file.close() #проверка хэшей перед запуском перебора def check_data(): global empty_all, check_all i1 = 0 while i1 < num_hash: check_input(hash[i1], i1) i1 += 1 for e1 in empty_not: if e1 == True: empty_all = True break if empty_all == False: print('Память пуста, нечего не введено!') for c1 in check: if c1 == True: check_all = True break if check_all == False: print('Память пуста, не верный ввод данных SHA256!') else: print('Данные занесены в память') #создание нового rehash def new_buffer(): global real_rehash, Smena real_rehash_list = list(real_rehash) n_rehash = len_sha for j_rehash in reversed(real_rehash_list): n_rehash -= 1 n_sym = 0 for j_sym in symbol_sha: if j_rehash == j_sym: if j_rehash == symbol_sha[15]: real_rehash_list[n_rehash] = symbol_sha[0] else: n_sym1 = n_sym + 1 real_rehash_list[n_rehash] = symbol_sha[n_sym1] Smena = True n_sym = 0 break else: n_sym += 1 if Smena == True: Smena = False break real_rehash = ''.join(real_rehash_list) #Основной код программы - перебор def main(): global real_hash, real_rehash, timeBegin, begin, check, rehash buffer = begin_over while buffer < limit_over: real_hash = sha256(real_rehash.encode()).hexdigest() i2 = 0 i3 = 0 while i2 < num_hash: if check[i2] == True: i3 = 0 if real_hash == hash[i2]: check[i2] = False rehash[i2] = real_rehash print('rehash найден') save_rehash(real_rehash, i2) else: i3 += 1 i2 += 1 if (i3 == num_hash) or (real_rehash == 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe'): print('Процесс перебора закончен') break new_buffer() buffer += 1 if time.time()-timeBegin >= 60: print('Буфер =', real_rehash) work_speed = round((buffer - begin)/(1000*60), 3) print('Скорость перебор = ', work_speed, 'kH/s') timeBegin = time.time() begin = buffer g = 0 while g < num_hash: for g_try in rehash_true: if g_try == True: print('ReHash[', g,'] = ', rehash[g]) g += 1 buffer_save() print('Процесс перебора закончен') print('Программа для перебора хешей SHA256') print('Разработчик: Didarcom') add_hash() check_data() buffer_add() main()
Программа работает в таком цикле:
1. add_hash() - считывает хэши с файла Input.txt, если не указаны в коде данные к папке Hashing и количество хэшей, то запращивает путь к папке и количество хэшей которые нужно считать с файла
2. check_data() - проверяет считанные хэши на корректность по длине символов, правильность к 16-тиричной системе и выставляет соответствующие флаги
3. buffer_add() - считывает буфер с файла buffer.txt и продолжает с этого места, если его нет то начинает с начала
4. main() - основной код перебора:
4.1 задается цикл
4.1.1 буфер хешируется и сравнивается с введенным хешом
4.1.2 если есть совпадение то записывается в фаил Output.txt
4.1.3 если нет совпадения, то создается новый буфер
4.1.4 с интервалом 1 мин записывается буфер в файл buffer.txt и выводится буфер и скорость перебора на консоль
4.1.5 переход на новый цикл пп. 4.1.1
Любое содействие приветствуется, так как я новичок в Python