Найти - Пользователи
Полная версия: Ускорение дешифратор SHA256 с способами GPU, многопоточности и многопроцессорности
Начало » Python для экспертов » Ускорение дешифратор SHA256 с способами GPU, многопоточности и многопроцессорности
1 2
Didarcom
Здравствуйте, уважаемые форумчане!
Познакомился с языком программирования 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
JOHN_16
Вы не сами написали этот код. Потому что не может человек написавший такое спрашивать такие очевидные вопросы. А сообщество не любит когда его обманывают
Didarcom
JOHN_16
Вы не сами написали этот код. Потому что не может человек написавший такое спрашивать такие очевидные вопросы. А сообщество не любит когда его обманывают
Я сам писал код, я программист по другому профилю (программирую на STEP7 Simatic), Python начал недавно изучать из-за необходимости дешифровки. Пробовал на Java и С++, только на Python получилось собрать рабочий код. Вот только не могу его ускорить или пока опыта не хватает. Просто я не силен в многопоточности и многопроцессорности. И не знаю как запустить код на прямую через видеокарту. Написать код не проблема, проблема его оптимизировать если не знать все плюшек Python. В плане кода, он вроде собран оптимально по моему мнению не знаю что еще упростить или выкинуть. Я его собрал из кусков видео уроков на YouTube, брал только то что пригодиться мне. А вообще, спасибо!
Didarcom
Я думаю как запараллелить выполнение функций new_buffer() - это даст прирост в скорости перебора, но не знаю пока как, так как она участвует в цикле перебора. Нужно вытащить из цикла и произвести создание нового буфера вторым потоком, а цикл пустить первым потоком, при новом цикле он брал бы готовый новый буфер и сравнивал бы, а не тормозил бы сам цикл для создания нового буфера. Это только размышление, возможно на практике сложно реализуемо или вообще не реализуемо. Рад любому предложению
doza_and
Didarcom
я программист по другому профилю
JOHN_16
А сообщество не любит когда его обманывают

1 Насчет сообщества не знаю, а я тоже думаю что профессионал задачи так не ставит. Загрузить все ядра и видеокарту это чушь. В нормальной постановке вы должны знать какое вам нужно быстродействие.
2. Желательно поместить код в теги <code> иначе тяжело читать, да и смысл кода на питоне меняется если вы отступы выкинули.
Didarcom
doza_and
1 Насчет сообщества не знаю, а я тоже думаю что профессионал задачи так не ставит. Загрузить все ядра и видеокарту это чушь. В нормальной постановке вы должны знать какое вам нужно быстродействие.
2. Желательно поместить код в теги <code> иначе тяжело читать, да и смысл кода на питоне меняется если вы отступы выкинули.

я же впервые на форуме не знаю всех примочек
doza_and
Didarcom
я же впервые на форуме
Понятно, теперь наверное народ по существу начнет смотреть.
py.user.next
Didarcom
я программист по другому профилю (программирую на STEP7 Simatic)
Видно, что ты никогда не писал программ больше ста строк. Учись программировать на современном языке общего назначения. По коду видно, что ты не знаешь не Python, а ты не знаешь, как разрабатывать программу на любом языке. То есть даже если ты Python выучишь, то ты на нём всё равно ничего не напишешь.

Ты знаешь, что такое “чистая функция”? Вот явно нет. А это элементарные вещи.

Didarcom
  
print('Программа для перебора хешей SHA256')
print('Разработчик: Didarcom')
Все эти выводы на экран подойдут только для каких-нибудь тупых бухгалтерш, которые вообще ничего в программах не понимают.


Для нас ты должен сначала описать программу словесно. Не что ты пытаешься в коде исправить, а что ты пишешь вообще, что за программу. Тогда мы посмотрим и подумаем, как её надо написать. И мы тебе расскажем, какой там должен быть код.
Didarcom

py.user.next
Видно, что ты никогда не писал программ больше ста строк. Учись программировать на современном языке общего назначения. По коду видно, что ты не знаешь не Python, а ты не знаешь, как разрабатывать программу на любом языке. То есть даже если ты Python выучишь, то ты на нём всё равно ничего не напишешь.

Ты знаешь, что такое “чистая функция”? Вот явно нет. А это элементарные вещи.

Я же писал что новичок в питоне и никто не сказал что это, только спамят меня
Разделение функции main() на несколько функции не дает результата, скорость перебора падает

 #Основной код программы - перебор
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('Процесс перебора закончен')

есть идея запуска функции new_buffer() втором потоком и привязать вызов готового нового буфера в начале нового цикла main(), но не знаю как это реализовать в коде
Didarcom
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB