Алгоритм Python Brute Force
Мне нужно создать каждую возможную комбинацию из данной кодировки в заданный диапазон.
Например,
charset=list(map(str,"abcdefghijklmnopqrstuvwxyz"))
range=10
И выход должен быть,
[a,b,c,d..................,zzzzzzzzzy,zzzzzzzzzz]
Я знаю, что могу это сделать, используя уже используемые библиотеки. Но мне нужно знать, как они на самом деле работают. Если кто-нибудь может дать мне комментарий кода такого типа алгоритма в Python или любой язык программирования, который я читал бы, я был бы очень признательна.
Ответы
Ответ 1
Если вы ДЕЙСТВИТЕЛЬНО хотите переустановить его, попробуйте это, но вам потребуется смешное количество времени:
your_list = 'abcdefghijklmnopqrstuvwxyz'
complete_list = []
for current in xrange(10):
a = [i for i in your_list]
for y in xrange(current):
a = [x+i for i in your_list for x in a]
complete_list = complete_list+a
В меньшем примере, где list = 'ab', и мы переходим только к 5, это печатает следующее:
['a', 'b', 'aa', 'ba', 'ab', 'bb', 'aaa', 'baa', 'aba', 'bba', 'aab', 'bab', 'abb', 'bbb', 'aaaa', 'baaa', 'abaa', 'bbaa', 'aaba', 'baba', 'abba', 'bbba', 'aaab', 'baab', 'abab', 'bbab', 'aabb', 'babb', 'abbb', 'bbbb', 'aaaaa', 'baaaa', 'abaaa', 'bbaaa', 'aabaa', 'babaa', 'abbaa', 'bbbaa', 'aaaba','baaba', 'ababa', 'bbaba', 'aabba', 'babba', 'abbba', 'bbbba', 'aaaab', 'baaab', 'abaab', 'bbaab', 'aabab', 'babab', 'abbab', 'bbbab', 'aaabb', 'baabb', 'ababb', 'bbabb', 'aabbb', 'babbb', 'abbbb', 'bbbbb']
Ответ 2
Используйте itertools.product
в сочетании с itertools.chain
для объединения разных длин:
from itertools import chain, product
def bruteforce(charset, maxlength):
return (''.join(candidate)
for candidate in chain.from_iterable(product(charset, repeat=i)
for i in range(1, maxlength + 1)))
Демонстрация:
>>> list(bruteforce('abcde', 2))
['a', 'b', 'c', 'd', 'e', 'aa', 'ab', 'ac', 'ad', 'ae', 'ba', 'bb', 'bc', 'bd', 'be', 'ca', 'cb', 'cc', 'cd', 'ce', 'da', 'db', 'dc', 'dd', 'de', 'ea', 'eb', 'ec', 'ed', 'ee']
Это позволит эффективно воспроизводить более крупные слова с наборами ввода, длиной до длины.
Не пытайтесь создать в памяти список из 26 символов длиной до 10; вместо этого перебирайте полученные результаты:
for attempt in bruteforce(string.ascii_lowercase, 10):
# match it against your password, or whatever
if matched:
break
Ответ 3
Я нашел еще один очень простой способ создания словарей с использованием itertools.
generator=itertools.combinations_with_replacement('abcd', 4 )
Это приведет к повторению всех комбинаций 'a', 'b', 'c' и 'd' и создаст комбинации с общей длиной от 1 до 4. то есть. а, б, в, г, аа, аб........., DDDC, дддд. Генератор - это объект itertool, и вы можете нормально прокручивать его,
for password in generator:
''.join(password)
Каждый пароль имеет значение типа кортежа, и вы можете работать с ним, как обычно.
Ответ 4
itertools
идеально подходит для этого:
itertools.chain.from_iterable((''.join(l)
for l in itertools.product(charset, repeat=i))
for i in range(1, maxlen + 1))
Ответ 5
Если вы действительно хотите использовать алгоритм грубой силы, не сохраняйте большой список в памяти вашего компьютера, если только вам не нужен медленный алгоритм, который завершается с ошибкой MemoryError.
Вы можете попробовать использовать itertools.product следующим образом:
from string import ascii_lowercase
from itertools import product
charset = ascii_lowercase # abcdefghijklmnopqrstuvwxyz
maxrange = 10
def solve_password(password, maxrange):
for i in range(maxrange+1):
for attempt in product(charset, repeat=i):
if ''.join(attempt) == password:
return ''.join(attempt)
solved = solve_password('solve', maxrange) # This worked for me in 2.51 sec
itertools.product(*iterables)
возвращает декартовы произведения введенных вами итераций.
[i for i in product('bar', (42,))]
возвращает, например, [('b', 42), ('a', 42), ('r', 42)]
Параметр repeat
позволяет вам сделать именно то, что вы просили:
[i for i in product('abc', repeat=2)]
Возвращает
[('a', 'a'),
('a', 'b'),
('a', 'c'),
('b', 'a'),
('b', 'b'),
('b', 'c'),
('c', 'a'),
('c', 'b'),
('c', 'c')]
Примечание:
Вы хотели алгоритм грубой силы, поэтому я дал его вам. Теперь, это очень длинный метод, когда пароль начинает увеличиваться, потому что он растет в геометрической прогрессии (потребовалось 62 секунды, чтобы найти слово "решено").
Ответ 6
from random import choice
sl = 4 #start length
ml = 8 #max length
ls = '9876543210qwertyuiopasdfghjklzxcvbnm' # list
g = 0
tries = 0
file = open("file.txt",'w') #your file
for j in range(0,len(ls)**4):
while sl <= ml:
i = 0
while i < sl:
file.write(choice(ls))
i += 1
sl += 1
file.write('\n')
g += 1
sl -= g
g = 0
print(tries)
tries += 1
file.close()
Ответ 7
import string, itertools
#password = input("Enter password: ")
password = "abc"
characters = string.printable
def iter_all_strings():
length = 1
while True:
for s in itertools.product(characters, repeat=length):
yield "".join(s)
length +=1
for s in iter_all_strings():
print(s)
if s == password:
print('Password is {}'.format(s))
break
Ответ 8
Попробуйте следующее:
import os
import sys
Zeichen=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s",";t","u","v","w","x","y","z"]
def start(): input("Enter to start")
def Gen(stellen): if stellen==1: for i in Zeichen: print(i) elif stellen==2: for i in Zeichen: for r in Zeichen: print(i+r) elif stellen==3: for i in Zeichen: for r in Zeichen: for t in Zeichen: print(i+r+t) elif stellen==4: for i in Zeichen: for r in Zeichen: for t in Zeichen: for u in Zeichen: print(i+r+t+u) elif stellen==5: for i in Zeichen: for r in Zeichen: for t in Zeichen: for u in Zeichen: for o in Zeichen: print(i+r+t+u+o) else: print("done")
#*********************
start()
Gen(1)
Gen(2)
Gen(3)
Gen(4)
Gen(5)
Ответ 9
Решение с использованием рекурсии:
def brute(string, length, charset):
if len(string) == length:
return
for char in charset:
temp = string + char
print(temp)
brute(temp, length, charset)
Использование:
brute("", 4, "rce")
Ответ 10
Простое решение с использованием itertools и строковых модулей
# modules to easily set characters and iterate over them
import itertools, string
# character limit so you don't run out of ram
maxChar = int(input('Character limit for password: '))
# file to save output to, so you can look over the output without using so much ram
output_file = open('insert filepath here', 'a+')
# this is the part that actually iterates over the valid characters, and stops at the
# character limit.
x = list(map(''.join, itertools.permutations(string.ascii_lowercase, maxChar)))
# writes the output of the above line to a file
output_file.write(str(x))
# saves the output to the file and closes it to preserve ram
output_file.close()
Я передал вывод в файл, чтобы сохранить оперативную память, и использовал функцию ввода, чтобы вы могли установить ограничение на число символов, например, "hiiworld". Ниже приведен тот же сценарий, но с более плавным набором символов с использованием букв, цифр, символов и пробелов.
import itertools, string
maxChar = int(input('Character limit for password: '))
output_file = open('insert filepath here', 'a+')
x = list(map(''.join, itertools.permutations(string.printable, maxChar)))
x.write(str(x))
x.close()