python algorithm brute-force

Algoritmo de fuerza bruta de Python



algorithm brute-force (10)

Solución simple utilizando los itertools y los módulos de cadena.

# 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()

Pagué la salida a un archivo para guardar el ram, y usé la función de entrada para que pueda establecer el límite de caracteres en algo como "hiiworld". A continuación se muestra la misma secuencia de comandos, pero con un conjunto de caracteres más fluido utilizando letras, números, símbolos y espacios.

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()

Necesito generar todas las combinaciones posibles de un conjunto de caracteres dado a un rango dado. Me gusta,

charset=list(map(str,"abcdefghijklmnopqrstuvwxyz")) range=10

Y la salida debe ser,

[a,b,c,d..................,zzzzzzzzzy,zzzzzzzzzz]

Sé que puedo hacer esto usando bibliotecas ya en uso. Pero necesito saber cómo funcionan realmente. Si alguien me puede dar un código comentado de este tipo de algoritmo en Python o cualquier lenguaje de programación legible, estaría muy agradecido.


Encontré otra forma muy fácil de crear diccionarios usando itertools.

generator=itertools.combinations_with_replacement(''abcd'', 4 )

Esto recorrerá 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 se puede recorrer 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.


Prueba esto:

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)


Si REALMENTE desea realizar una fuerza bruta, intente esto, pero le tomará una cantidad de tiempo ridícula:

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 hasta 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'']


Si realmente desea un algoritmo de fuerza bruta, no guarde ninguna lista grande en la memoria de su computadora, a menos que desee un algoritmo lento que se bloquee con un error de memoria.

Podrías intentar usar itertools.product como este:

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) devuelve los productos cartesianos de los iterables que ingresó.

[i for i in product(''bar'', (42,))] devuelve, por ejemplo, [(''b'', 42), (''a'', 42), (''r'', 42)]

El parámetro de repeat permite hacer exactamente lo que pidió:

[i for i in product(''abc'', repeat=2)]

Devoluciones

[(''a'', ''a''), (''a'', ''b''), (''a'', ''c''), (''b'', ''a''), (''b'', ''b''), (''b'', ''c''), (''c'', ''a''), (''c'', ''b''), (''c'', ''c'')]

Nota :

Querías un algoritmo de fuerza bruta, así que te lo di. Ahora, es un método muy largo cuando la contraseña comienza a ser más grande porque crece exponencialmente (tomó 62 segundos para encontrar la contraseña ''resuelta''). También puede usar un código de contraseña ya existente o generarlo con peajes como cupp ( github )


Una solución mediante recursión:

def brute(string, length, charset): if len(string) == length: return for char in charset: temp = string + char print(temp) brute(temp, length, charset)

Uso:

brute("", 4, "rce")


Use itertools.product , combinado con itertools.chain para juntar las diferentes 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á eficientemente palabras progresivamente más grandes con los conjuntos de entrada, hasta longitud máxima de longitud.

No intente generar una lista en memoria de 26 caracteres hasta una longitud de 10; 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


itertools es ideal para esto:

itertools.chain.from_iterable((''''.join(l) for l in itertools.product(charset, repeat=i)) for i in range(1, maxlen + 1))


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()


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