J'ai besoin de générer toutes les combinaisons possibles d'un jeu de caractères donné à une plage donnée .
charset=list(map(str,"abcdefghijklmnopqrstuvwxyz"))
range=10
Et la sortie devrait être,
[a,b,c,d..................,zzzzzzzzzy,zzzzzzzzzz]
Je sais que je peux le faire en utilisant des bibliothèques déjà utilisées.Mais j'ai besoin de savoir comment elles fonctionnent vraiment.Si quelqu'un peut me donner un code commenté de ce type d'algorithme en Python ou tout autre langage de programmation lisible, je vous en serais très reconnaissant.
Si vous voulez VRAIMENT le forcer brutalement, essayez ceci, mais cela vous prendra un temps ridicule:
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
Sur un exemple plus petit, où list = 'ab' et que nous n'allons que jusqu'à 5, cela affiche ce qui suit:
['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']
Utilisez itertools.product
, combiné avec itertools.chain
pour assembler les différentes longueurs:
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)))
Manifestation:
>>> 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']
Cela produira efficacement des mots progressivement plus grands avec les ensembles d’entrée, jusqu’à longueur maxlength.
Faites pas essayez de générer une liste en mémoire de 26 caractères d’une longueur maximale de 10; à la place, parcourez les résultats obtenus:
for attempt in bruteforce(string.ascii_lowercase, 10):
# match it against your password, or whatever
if matched:
break
J'ai trouvé un autre moyen très simple de créer des dictionnaires avec itertools.
generator=itertools.combinations_with_replacement('abcd', 4 )
Cela va parcourir toutes les combinaisons de 'a', 'b', 'c' et 'd' et créer des combinaisons d'une longueur totale de 1 à 4. ie a, b, c, d, aa, ab ........., dddc, dddd. générateur est un objet itertool et vous pouvez faire une boucle normalement comme ça,
for password in generator:
''.join(password)
Chaque mot de passe est de type Tuple et vous pouvez y travailler comme d’habitude.
itertools
convient parfaitement pour cela:
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
# 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()
J'ai transféré la sortie dans un fichier pour enregistrer la mémoire RAM et j'ai utilisé la fonction d'entrée afin que vous puissiez définir la limite de caractères sur "hiiworld". Vous trouverez ci-dessous le même script, mais avec un jeu de caractères plus fluide composé de lettres, de chiffres, de symboles et d’espaces.
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()
Essaye ça:
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)
Une solution utilisant la récursivité:
def brute(string, length, charset):
if len(string) == length:
return
for char in charset:
temp = string + char
print(temp)
brute(temp, length, charset)
Usage:
brute("", 4, "rce")