Сегодня понадобилось написать простой код для перебора случайно сгенерированных четырехзначных паролей, для «взлома». Естественно, пароль, который мы будем «взламывать», мы введем сами, в этой же программе, ведь я не хочу создавать скрипт для брута, а лишь хочу продемонстрировать новичкам в программировании, как должен работать подобный скрипт.
Еще по теме: Взлом WiFi на Python
Для начала надо выбрать язык. Я решил выбрать Python, так как он приятней глазу, и на нем будет проще объяснить, как работает процесс перебора паролей.
Итак, начнем. Какие модули нам необходимы? Только один — random! Импортируем его.
1 |
import random |
Далее, надо определиться с переменными. Нам нужны 6.
1 2 3 4 5 6 |
correctPassword = "1234" # Вводим пароль, который нужно забрутить wrongPasswords = [] # В этот список будут добавляться уже подобранные пароли, чтобы не повторяться password = "" # В эту переменную будет записываться сгенерированный пароль, и, если он ложный, пойдет в wrongPassword length = 4 # Длина пароля. Эта переменная нужна будет в будущем chars = "1234567890" # Символы, из которых будет генерироваться пароль. run = True # Думаю, не стоит объяснять |
Вот и все необходимые переменные.
Теперь необходимо создать цикл. В нем все и будет выполняться. Также добавим в него строчку для обнуления переменной password
1 2 |
while run: password = "" |
Переходим к самому интересному — генерации и перебору паролей.
Сначала создадим цикл for, для генерации пароля. Тут нам и пригодится переменная length.
1 2 |
for i in range(length): password += random.choise(chars) |
Теперь напишем код, который будет проверять, генерировала уже программа этот пароль, или нет. Ну и проверять, идентичен ли он правильному.
1 2 3 4 5 6 7 8 |
if password not in wrongPasswords: print(password) if password != correctPassword: wrongPasswords.append(password) else: run = False break print(password + " is correct") |
Вот и все! Все работает!
Надеюсь, кому-то данная статья помогла, кому-то просто была интересна.
Весь код полностью:
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 |
import random correctPassword = "1234" wrongPasswords = [] password = "" length = 4 chars = "12e4567890" run = True while run: password = "" for i in range(length): password += random.choise(chars) if password not in wrongPasswords: if password != correctPassword: print(password) wrongPasswords.append(password) else: run = False break print(password + " is correct") |
Еще по теме: Простой кейлоггер на Python
Куди це вводить
Опечатка в строке
…
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 раз дольше… Как то так
Спасибо!
Ну во первых вероятность сильно ничтожная.
Во вторых, время работы этого скрипта будет очень большая.
В третьих, как быстро вы переполните оперативу хранением такого длинного массива в памяти.
В четвертых, с увлечением массива будет замедляться скорость работы кода.
В пятых, выносите все if по возможности за пределы цикла, для ускорения брута.
Самый оптимальный способ это создание функции для генерации пароля, после чего хранить его там.вА после чего вызывать уже отдельную функцию для его перебора.
Так же для простого числового пароля, проще сделать так же отдельную функцию которая с каждой итерацией будет увеличиваться на +1.
Скорость взлома пароля 11111 таким методом занимает 8 секунд, что будет гораздо быстрее чем это рандомить.
А что делать если не знаешь пароль?
если я введу пароль 10001 то он у тебя никогда не подберётся
Зачем choice? Есть же sample!
Строка password += random.choiCe(chars) выдает ошибку, почему?
choiCe надо писать так: choice
p = 0
x = int(input(‘Допустимо це пароль який ми незнаємо і нам нада його підібрати : ‘))
while p < x:
print(p)
p += 1
print('пароль : ', f'{p:02}')
У меня вопрос, вот сделана программа для подбора паролей, а как её использовать-то? Ну вот есть у меня пароль на том же телефоне, как мне сделать так чтоб программа именно там проверила пароль, а не просто проверяла все числа?
Я чел проста хочу узнать как получить код чтобы вернуть аккаунт гугл
Эмм, а может перебирать просто пароли по возрастанию?