Недавно вышла новая версия программы по перебору паролей для архивов RAR cRARk v. 3.2 (пока BETA), где я впервые попробовал применить технологию вычислений на видеокартах NVIDIA CUDA. О своих первых впечатлениях об использовании CUDA я бы хотел рассказать.
Первое, и самое главное: в таких задачах, как перебор паролей, которые по своей сути допускают легкое распараллеливание, использование CUDA оказывается чрезвычайно простым. Написание исходного текста программы на CUDA оказалось очень легким: я взял код функции SetCryptKeys() из исходных текстов UnRAR, добавил к ней свободно распространяемые реализации криптографических функций SHA-1 и AES, после чего вставил у всех используемых функций спецификатор __device__, который означает, что эти функции будут выполнятся на устройстве (GPU). По сути, никаких переделок кода с языка C/C++ на CUDA не потребовалось и первая же версия программы, которая смогла скомпилироваться, выдавала осмысленные результаты!
Далее, сложность отладки под GPU оказалась преувеличенной. В опциях компилятору можно указать “-deviceemu”, после чего отлаживать становится возможным в режиме эмуляции, под любимым отладчиком, например, прямо в Visual Studio. Да, в этом режиме эмуляция GPU невозможна на 100%, и некоторые тонкие моменты (например, синхронизацию потоков) там не отладить, но тем не менее режим эмуляции позволяет отладить большинство возникающих проблем. Также я столкнулся с тем, что запись по невыровненному адресу в режиме эмуляции работает, а на реальном устройстве — нет:
Создание генератора паролей в Python.
long A[N], i;
* (long *) ((char *)A + 3) = i; // запись по адресу, // не кратному 4
Компилятор nvcc, несмотря на версию 2.1, все еще является сыроватым. Так, я несколько раз в разных ситуациях получал сообщение о внутренней ошибке компилятора, и совершенно было непонятно, где искать проблему, так номер строки в этом случае не выводится.
Опытным путем было выяснено, что он не любит использования функции memcpy(), которая часто встречается в реализации криптопримитивов. По логике, должно быть сообщение об ошибке вызова функции хоста (__host__) на устройстве, вместо этого выдавалось сообщение: “Signal: caught in PU_adjust_addr_flags phase”.
Следующая проблема, которая не описана как следует в документации, заключалась в том, что каждый вызов ядра (kernel) должен выполняться на GPU не более 5 секунд. Поскольку для проверки одного пароля RAR необходимо сделать около 70.000 преобразований SHA-1, то, задавая довольно большие размеры сетки (grid), можно очень скоро упереться в этот барьер, получая сообщение типа “the launch timed out and was terminated”.
Наконец, оптимизация программ на CUDA оказалась довольно трудоемкой и малоэффективной. Так, первая рабочая версия cRARk под CUDA выдавала около 200 паролей в секунду, нынешняя версия показывает 240 (на GeForce 8600GTS). При этом мне кажется, что скорость можно поднять еще как минимум в 2 раза (мое предположение основывается на скорости вычислений MD5 на CUDA, рассмотренной в прошлый раз). На сайте crark.net я выложил исходники реализации перебора паролей RAR на CUDA. Если есть желающие помочь в оптимизации этой бесплатной утилиты, буду рад.
Брутфорс Алгоритм подбора паролей
Таким образом, технология CUDA, бесспорно, является очень эффективной и легкой в применении в задачах перебора паролей, но при практической реализации возникает ряд подводных камней, затрудняющих получение наилучших результатов. В частности, для рассмотренной задачи перебора паролей RAR пока скорость на топовых моделях видеокарт и процессоров оказывается примерно одинаковой — около 1000 паролей в секунду.
34 комментариев
Other Links to this Post
Оставить комментарий
You must be logged in to post a comment.
Источник: www.password-crackers.ru
как написать брутфорс на python
Сегодня понадобилось написать простой код для перебора случайно сгенерированных четырехзначных паролей, для «взлома». Естественно, пароль, который мы будем «взламывать», мы введем сами, в этой же программе, ведь я не хочу создавать скрипт для брута, а лишь хочу продемонстрировать новичкам в программировании, как должен работать подобный скрипт.
Для начала надо выбрать язык. Я решил выбрать Python, так как он приятней глазу, и на нем будет проще объяснить, как работает процесс перебора паролей.
Итак, начнем. Какие модули нам необходимы? Только один — random! Импортируем его.
Далее, надо определиться с переменными. Нам нужны 6.
Вот и все необходимые переменные.
Теперь необходимо создать цикл. В нем все и будет выполняться. Также добавим в него строчку для обнуления переменной password
Переходим к самому интересному — генерации и перебору паролей.
Сначала создадим цикл for, для генерации пароля. Тут нам и пригодится переменная length.
Теперь напишем код, который будет проверять, генерировала уже программа этот пароль, или нет. Ну и проверять, идентичен ли он правильному.
Вот и все! Все работает!
Надеюсь, кому-то данная статья помогла, кому-то просто была интересна.
Весь код полностью:
Похожие статьи
Взлом программы защищенной протектором Enigma
Сбор информации о системе удаленно с помощью Python
Создание руткита в Linux с помощью LD_PRELOAD
12 комментариев
Опечатка в строке
…
password += random.choiCe(chars)
…
Код конечно отвратительный. Генерить рандомные пароли — самый медленный метод перебора, который только возможно придумать (много времени уйдёт на определение того, выбирали ли мы его раньше). Конкретные недостатки:
1) Инициализацию переменной length следует делать используя len(correctPassword), чтобы при вводе надо было изменять одну строку, а не две.
2) Переменная run не выполняет никакой функции, поскольку одновременно с run=False выполняется break. Следует либо убрать оттуда break, либо удалить run и сделать while True.
3) Переменную wrongPasswords лучше сделать не списком, а множеством, поскольку тогда будет быстрее проверка наличия в нем элемента.
4) Инициализация переменной password до цикла не требуется.
5) Поскольку из модуля random используется только одна функция, лучше писать не import random, а from random import choice.
Был поражен, увидев столько косяков в столь коротком коде…
Ну если уж совсем придираться, то в конструкции if-else лучше не использовать в условии отрицание, то есть так:
Это не принципиально, просто немного лучше воспринимается при чтении кода. В остальном да, так гораздо лучше (алгоритм до сих пор медленный, на длинных паролях последовательный перебор работает куда лучше)
Вообще говоря, у вашего алгоритма даже средняя сложность больше, она равна количеству возможным комбинаций, тем временем как у последовательного перебора она в два раза меньше. Про максимальную сложность вообще молчу, она у вас бесконечна)). А у последовательного перебора макс. сложность равна вашей средней…
И при этом на практике ваш алгоритм получается не в 2 а примерно в 10 раз дольше… Как то так