Форум программистов, компьютерный форум, киберфорум
GPGPU
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 4
1

Ускорение дешифратор SHA256 с способами GPU, многопоточности и многопроцессорности

17.09.2018, 02:01. Показов 6784. Ответов 8

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!
Познакомился с языком программирования python, решил написать дешифратор хеша sha256. Программа работает но медленно, прошу Вашего содействия для ускорения работы программы. На данный момент дает скорость 60-75кН/с и загружает только один ЦП (центральный процессор) на 50% с использованием одного ядра, не использует ГП (графический процессор).
Не знаю как применить многопоточность и многоядерность?
Как сделать чтобы программа полностью выполнялась на ГП?
Как использовать ресурсы ГП (на любой видеокарте) или ЦП на 80-90%?
Я в этой области новичок, у меня видеокарта GeForce 610M.
Вот сам код:
Python
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
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
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2018, 02:01
Ответы с готовыми решениями:

Теория о многопоточности и многопроцессорности
Ребят, возник вот такой вопрос: в каком случае многопоточность и многопроцессорность не будут...

GPU ускорение в Media Encoder
Мы организация, которая планирует профессионально заниматься видео продакшн в массовом количестве....

[Sony Vegas 13] Ускорение обработки видео за счет подключения GPU
Раньше с Sony Vegas не работал. Наше что можно подключить GPU для быстроты обработки рендеринга...

Соотношение многопоточности приложения c++ и многопоточности на уровне системы?
Возник следующий вопрос: в C++ существует два варианта работы с многопоточностью - std::theard и...

8
931 / 692 / 270
Регистрация: 10.12.2016
Сообщений: 1,707
18.09.2018, 10:22 2
хэш - односторонняя шифрация, непонятно что вам надо. подбор паролей или проверка контрольной суммы?
0
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 4
18.09.2018, 16:30  [ТС] 3
суть программы из 16-тиричной системы символов длиной 64 символа (rehash) сделать его хэш по sha256 (real_hash) и сравнить с введенным хэшом (hash), если есть совпадение (real_hash == hash) то произвести запись (rehash) в файл Output.txt, но если нет совпадения (real_hash != hash) то производиться новая генерация (rehash) и так повторяется в цикле
0
931 / 692 / 270
Регистрация: 10.12.2016
Сообщений: 1,707
18.09.2018, 17:18 4
Цитата Сообщение от Didarcom Посмотреть сообщение
суть программы из 16-тиричной системы символов длиной 64 символа (rehash) сделать его хэш
это в смысле 64 байта? пример входных данных покажите
0
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 4
18.09.2018, 18:23  [ТС] 5
Входные данные такие:
Введите количество HASH (max = 24): 9
F:\Project\Python\ReSHA256
Hash 0 = ea3cc70874294edfb16c6ae710513bdfc5231c95017eea3d04ccdd5e4216c19c
Hash 1 = 54cec6c5bf15c3804d7dd989d42db4698656964c214323efd219e1d9f488a941
Hash 2 = 787c5691841b7b37dc62dd705d2862ca079fc641df558566c1e5350fe5c79d64
Hash 3 = 803da4369bc98774d723c657624cda84509f915c6aa60df415b51442825355d1
Hash 4 = 86a3e1f94e8b9f6292b14fd251e2bbac8f4abb1a75c1135f5f1e558e01143bcd
Hash 5 = 8891a2e696a76f58d49027db732d7c0147a92168e7bb20496659ed8360af2a2a
Hash 6 = 91054dcca25b8dc549ee1bda896e0083037831d1abe27334808ae014455c5cc4
Hash 7 = d413dccf222f6ccd4431458286c36c720ab46e7dd420e35b018b64a0859a883e
Hash 8 = 3050b234ff4fa04cc13478c56730a139538647004af300bfb62a53ff4c60dcc8
Миниатюры
Ускорение дешифратор SHA256 с способами GPU, многопоточности и многопроцессорности  
0
931 / 692 / 270
Регистрация: 10.12.2016
Сообщений: 1,707
18.09.2018, 19:45 6
типа так
Python
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
from hashlib import sha256
 
sha_pattern = '0123456789abcdef'
 
def check_input(s,patt):
    if len(s) != 64: return False
    for i in s:
        if not i in patt:
            return False
    return True
    
def check_hash(s,sha):
    h = sha256(s.encode()).hexdigest()
    if h in sha: return True
    return False
    
if __name__ == "__main__":
    
    from random import sample
    #генерим данные
    l = [''.join(sample('0123456789abcdefj',16)*4) for i in range(10)]
    #генерим хеши
    sha = [sha256(i.encode()).hexdigest() for i in l]
    for i in l:
        if check_input(i,sha_pattern) and check_hash(i,sha):
            print(i)
Добавлено через 7 минут
лучше даже так
Python
1
2
3
4
5
6
7
8
9
10
11
12
if __name__ == "__main__":
    
    from random import sample
    from time import time
    #генерим данные
    t0 = time()
    l = [''.join(sample('0123456789abcdefj',16)*4) for i in range(10000)]
    #генерим хеши
    sha = [sha256(i.encode()).hexdigest() for i in l]
    out = [i for i in l if check_input(i,sha_pattern) and check_hash(i,sha)]
    print(time() - t0)
    print(len(out))
1
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 4
19.09.2018, 16:25  [ТС] 7
ты предлагаешь создать случайный генератор входных данных через массив, но проблема в том что возможные комбинации длиной 64 символа из 16 символом (0-f) составляет 488526937079580 комбинации. Создание такого размера массива приведет программу в тупик. Я применил другой подход: сделал генерацию новой комбинации на подобие счетчика, т.е. смена последнего символа на один символ выше (0-f), при достижении символа f меняется предпоследний символ на символ выше и так пока не достигнет комбинации "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"
образец:
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000002
.........
000000000000000000000000000000000000000000000000000000000000000a
000000000000000000000000000000000000000000000000000000000000000b
........
fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe

такой подход дает возможность не создавать массив большого размера и не грузить память
За
check_input(s,patt)
и за
check_hash(s,sha)
большое спасибо
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
19.09.2018, 17:37 8
Цитата Сообщение от Didarcom Посмотреть сообщение
такой подход дает возможность не создавать массив большого размера
В python для этого существуют генераторы.

Цитата Сообщение от Didarcom Посмотреть сообщение
Как сделать чтобы программа полностью выполнялась на ГП?
Для использования GPU нужно юзать PyCUDA (естественно, требуется видеокарта Nvidia с установленной CUDA toolkit).
Но весь вычислительный код придется переписать на Си образный диалект.

Python
1
2
3
4
5
6
7
8
from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
  const int i = threadIdx.x;
  dest[i] = a[i] * b[i];
}
""")
0
931 / 692 / 270
Регистрация: 10.12.2016
Сообщений: 1,707
19.09.2018, 19:36 9
Цитата Сообщение от Didarcom Посмотреть сообщение
ты предлагаешь создать случайный генератор входных данных через массив, н
это просто пример входных данных.
вообще такие проги надо на Си делать, питон для арифметики медленный
1
19.09.2018, 19:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2018, 19:36
Помогаю со студенческими работами здесь

Скорость, касательное ускорение, полное ускорение, нормальное ускорение и радиус кривизны траектории
Движение точки задано координатным способом. Найти траекторию и начертить ее. Кроме того определить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru