Tenemos el arreglo a este conflicto, o por lo menos eso creemos. Si presentas alguna pregunta coméntalo, para nosotros será un placer ayudarte
Solución:
Usar itertools.product
combinado con itertools.chain
para juntar las distintas longitudes:
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)))
Demostración:
>>> 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']
Esto producirá de manera eficiente palabras progresivamente más grandes con los conjuntos de entrada, hasta la longitud máxima.
Hacer no intente producir una lista en memoria de 26 caracteres hasta 10 de longitud; en su lugar, iterar sobre los resultados producidos:
for attempt in bruteforce(string.ascii_lowercase, 10):
# match it against your password, or whatever
if matched:
break
Si REALMENTE quieres usar la fuerza bruta, prueba esto, pero te llevará una cantidad ridícula de tiempo:
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
En un ejemplo más pequeño, donde list = ‘ab’ y solo subimos a 5, esto imprime lo siguiente:
['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']
Encontré otra manera muy fácil de crear diccionarios usando itertools.
generator=itertools.combinations_with_replacement('abcd', 4 )
Esto iterará a través de todas las combinaciones de ‘a’, ‘b’, ‘c’ y ‘d’ y creará combinaciones con una longitud total de 1 a 4. es decir. a,b,c,d,aa,ab………,dddc,dddd. El generador es un objeto de itertool y puede recorrerlo normalmente de esta manera,
for password in generator:
''.join(password)
Cada contraseña es de hecho de tipo tupla y puede trabajar en ellas como lo hace normalmente.