Форум сайта python.su
Здравствуйте, уважаемые форумчане!
Познакомился с языком программирования 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()
Отредактировано Didarcom (Сен. 17, 2018 19:20:08)
Прикреплённый файлы:
Forum.py (7,1 KБ)
Офлайн
Вы не сами написали этот код. Потому что не может человек написавший такое спрашивать такие очевидные вопросы. А сообщество не любит когда его обманывают
Офлайн
JOHN_16Я сам писал код, я программист по другому профилю (программирую на STEP7 Simatic), Python начал недавно изучать из-за необходимости дешифровки. Пробовал на Java и С++, только на Python получилось собрать рабочий код. Вот только не могу его ускорить или пока опыта не хватает. Просто я не силен в многопоточности и многопроцессорности. И не знаю как запустить код на прямую через видеокарту. Написать код не проблема, проблема его оптимизировать если не знать все плюшек Python. В плане кода, он вроде собран оптимально по моему мнению не знаю что еще упростить или выкинуть. Я его собрал из кусков видео уроков на YouTube, брал только то что пригодиться мне. А вообще, спасибо!
Вы не сами написали этот код. Потому что не может человек написавший такое спрашивать такие очевидные вопросы. А сообщество не любит когда его обманывают
Отредактировано Didarcom (Сен. 17, 2018 16:59:51)
Офлайн
Я думаю как запараллелить выполнение функций new_buffer() - это даст прирост в скорости перебора, но не знаю пока как, так как она участвует в цикле перебора. Нужно вытащить из цикла и произвести создание нового буфера вторым потоком, а цикл пустить первым потоком, при новом цикле он брал бы готовый новый буфер и сравнивал бы, а не тормозил бы сам цикл для создания нового буфера. Это только размышление, возможно на практике сложно реализуемо или вообще не реализуемо. Рад любому предложению
Офлайн
Didarcom
я программист по другому профилю
JOHN_16
А сообщество не любит когда его обманывают
Офлайн
doza_and
1 Насчет сообщества не знаю, а я тоже думаю что профессионал задачи так не ставит. Загрузить все ядра и видеокарту это чушь. В нормальной постановке вы должны знать какое вам нужно быстродействие.
2. Желательно поместить код в теги <code> иначе тяжело читать, да и смысл кода на питоне меняется если вы отступы выкинули.
Офлайн
DidarcomПонятно, теперь наверное народ по существу начнет смотреть.
я же впервые на форуме
Офлайн
DidarcomВидно, что ты никогда не писал программ больше ста строк. Учись программировать на современном языке общего назначения. По коду видно, что ты не знаешь не Python, а ты не знаешь, как разрабатывать программу на любом языке. То есть даже если ты Python выучишь, то ты на нём всё равно ничего не напишешь.
я программист по другому профилю (программирую на STEP7 Simatic)
DidarcomВсе эти выводы на экран подойдут только для каких-нибудь тупых бухгалтерш, которые вообще ничего в программах не понимают.print('Программа для перебора хешей SHA256') print('Разработчик: Didarcom')
Офлайн
py.user.next
Видно, что ты никогда не писал программ больше ста строк. Учись программировать на современном языке общего назначения. По коду видно, что ты не знаешь не Python, а ты не знаешь, как разрабатывать программу на любом языке. То есть даже если ты Python выучишь, то ты на нём всё равно ничего не напишешь.
Ты знаешь, что такое “чистая функция”? Вот явно нет. А это элементарные вещи.
#Основной код программы - перебор 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('Процесс перебора закончен')
Отредактировано Didarcom (Сен. 18, 2018 02:39:22)
Офлайн
py.user.next
Для нас ты должен сначала описать программу словесно. Не что ты пытаешься в коде исправить, а что ты пишешь вообще, что за программу. Тогда мы посмотрим и подумаем, как её надо написать. И мы тебе расскажем, какой там должен быть код.
Didarcom
Программа работает в таком цикле:
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
Офлайн