Advertisement
pakuula

async_bruteforce

Jan 15th, 2025
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.47 KB | None | 0 0
  1. """Пример перебора пароля с использованием asyncio
  2. К вопросу https://ru.stackoverflow.com/questions/1604891
  3. """
  4. import asyncio
  5. import string
  6. import time
  7.  
  8. PASSWORD = 'zxcgg'
  9.  
  10. async def check_password(attempt):
  11.     # print(f"Пробуем: {attempt}")
  12.     await asyncio.sleep(0) # имитация задержки
  13.     if attempt == PASSWORD:
  14.         print(f"Пароль найден: {attempt}")
  15.         return True
  16.     else:
  17.         return False
  18.  
  19. class ResutlStorage[T]:
  20.     """Хранилище для результата поиска. Минимальная реализация, not thread safe"""
  21.     def __init__(self):
  22.         self.result : T = None # pylint: disable=undefined-variable
  23.         self.found = False
  24.    
  25.     def set_result(self, result: T) -> None: # pylint: disable=undefined-variable
  26.         """Сохранить результат, выставить флаг готовности"""
  27.         self.result = result
  28.         self.found = True
  29.    
  30.     def has_result(self) -> bool:
  31.         """Вернуть True если результат найден."""
  32.         return self.found
  33.    
  34.     def get_result(self) -> T: # pylint: disable=undefined-variable
  35.         """Вернуть найденный результат"""
  36.         return self.result
  37.  
  38. def iterate_passwords_fixed_length(length: int):
  39.     """Генератор строк фиксированной длины"""
  40.     print(f"iterate_passwords_fixed_length: len={length}")
  41.     characters = string.ascii_lowercase
  42.     if length == 0:
  43.         yield ''
  44.     else:
  45.         for password in iterate_passwords_fixed_length(length - 1):
  46.             for char in characters:
  47.                 yield password + char
  48.  
  49. def iterate_passwords(max_length: int):
  50.     """Генератор строк длиной не более заданной"""
  51.     print(f"iterate_passwords: length={max_length}")
  52.     for length in range(1, max_length+1):
  53.         yield from iterate_passwords_fixed_length(length)
  54.  
  55. async def task_builder(max_length: int, tasks: asyncio.Queue, password: ResutlStorage[str]):
  56.     """Генератор пробных строк для подбора пароля"""
  57.     print("task_builder: Начало работы")
  58.     for attempt in iterate_passwords(max_length):
  59.         await tasks.put(attempt)
  60.         if password.has_result():
  61.             print(f"task_builder: Пароль найден: {password.get_result()}")
  62.             print("task_builder: Завершение работы")
  63.             return
  64.  
  65. async def task_executor(num: int, tasks: asyncio.Queue, password: ResutlStorage[str]):
  66.     """Потребитель пробных строк, выполняет проверку пароля.
  67.    
  68.    Параметры:
  69.    num -- номер работника
  70.    tasks -- очередь задач
  71.    password -- хранилище результата
  72.    """
  73.     print(f"task_executor {num}: Начало работы")
  74.     while True:
  75.         if password.has_result():
  76.             print(f"task_executor {num}: Пароль найден другим работником")
  77.             print(f"task_executor {num}: Завершение работы")
  78.             return
  79.         attempt = await tasks.get()
  80.         print(f"task_executor {num}: Пробуем: {attempt}")
  81.         if await check_password(attempt):
  82.             print(f"task_executor {num}: Пароль найден: {attempt}")
  83.             password.set_result(attempt)
  84.             print(f"task_executor {num}: Завершение работы")
  85.             return
  86.  
  87. async def async_bruteforce(max_length: int, nworkers: int = 16):
  88.     """Настраивает и запускает асинхронный перебор паролей
  89.    Параметры:
  90.    max_length -- максимальная длина пароля
  91.    nworkers -- количество рабочих потоков для перебора паролей
  92.    """
  93.     tasks = asyncio.Queue(nworkers)
  94.     password_store = ResutlStorage[str]()
  95.     task_producer = task_builder(max_length, tasks, password_store)
  96.     workers = [task_executor(i, tasks, password_store) for i in range(nworkers)]
  97.     await asyncio.gather(task_producer, *workers)
  98.  
  99. print("\n Асинхронный перебор пароля:")
  100. async_start_time = time.time()
  101. asyncio.run(async_bruteforce(8))
  102. print(f"Время асинхронного перебора: {time.time() - async_start_time:.2f} секунд")
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement