web-dev-qa-db-fra.com

Algorithme Python Brute Force

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. 

17
Madushan

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']
14
Rob Volgman

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
44
Martijn Pieters

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.

4
Pandora Boz

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))
3
ecatmur
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()
1
Nikita Mokrinskiy
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
1
Lumo5

Solution simple utilisant les outils itertools et string

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

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)
0
Vitalii

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")
0
gnj