Брутфорс с нитками? - PullRequest
       40

Брутфорс с нитками?

0 голосов
/ 22 февраля 2020

Итак, я решил сделать брутфорс, и он работает на всех oop. К сожалению, он очень медленный, поэтому вот код и проблема:

import itertools
from time import sleep
import os
import multiprocessing as mp
from threading import Thread
import keyboard

count = CharLength = 1

pw = input("Password: ")

chars = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.")

for CharLength in range(25):
    password = (itertools.product(chars, repeat = CharLength))
    for i in password:
        if keyboard.is_pressed("esc"):
            print("\"esc\" pressed. Program ended.")
            exit()
        count += 1
        i = str(i)
        i = i.replace("'", "")
        i = i.replace(" ", "")
        i = i.replace(",", "")
        i = i.replace("(", "")
        i = i.replace(")", "")
        print(i)
        if i == pw:
            print("\n-=-=-=-=-=-=\n")
            print("Password found: " + i)
            print("\n-=-=-=-=-=-=\n")
            exit()


Интересно, смогу ли я ускорить процесс подбора паролей, возможно, с несколькими потоками (может быть и без потоков c!) ?

Если есть какие-либо вопросы, просто спросите меня!

-Lotus

1 Ответ

0 голосов
/ 22 февраля 2020

О Python и многопоточности для оптимизации:

Обратите внимание, что Python использует GIL (Global Interpreter Lock) Другими словами. Python никогда не выполнит более одного Python байтового кода одновременно, даже если у вас несколько потоков и несколько процессоров.

Так что для чистого Python кода (без привязок C этот выпуск GIL) Python многопоточность никогда не увеличит производительность)

Если вы хотите повысить производительность, я предлагаю вместо этого использовать многопроцессорный модуль.

О потенциальных оптимизациях:

Я пытался угадать пароль awdf на моем компьютере старше 10 лет:

С вашим кодом требуется около 18,5 секунд:

1.) Удалить print () до 11,3 секунд

2.) вызов функции keyboard.is_pressed() недешев, поэтому проверяйте ее только каждые 1000 раз. Вы опускаетесь до 1,3 секунд

вы делаете это с:

            if count % 1000 == 0:
                if keyboard.is_pressed("esc"):
                    print("\"esc\" pressed. Program ended.")
                    exit()

3.) более простым способом преобразования результата itertools.product в пароль

вместо

            i = str(i)
            i = i.replace("'", "")
            i = i.replace(" ", "")
            i = i.replace(",", "")
            i = i.replace("(", "")
            i = i.replace(")", "")

просто сделайте

i ="".join(i)

до 0,2 секунды

4.) Вместо конвертирования Используя каждый результат itertools.product (кортеж) в строку, я могу преобразовать строку пароля вне l oop один раз в кортеж, поэтому я сравниваю кортежи и не конвертирую.

I до 0,15 с

Самая быстрая версия с последующими 0,06 с.

Больше не нужно считать / больше не прерывать с esc (это нужно было сделать, убив процесс)

    chars = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_.")

    pw = tuple(pw)

    for CharLength in range(1, 25):
        passwords = (itertools.product(chars, repeat = CharLength))

        first_match = filter(lambda elm: elm == pw, passwords)
        try:
            passwd = next(first_match)
            passwd =  "".join(passwd)
            print("Password found: " + passwd)
        except StopIteration:
            pass

Но учтите, что в большинстве реальных случаев ios выяснение правильности пароля выполняется не путем сравнения строк, а путем вычисления га sh. Эти операции намеренно медленные, поэтому они, вероятно, будут гораздо важнее, чем любая из моих оптимизаций здесь.

...