Генератор всех возможных 8 символов строки. Брутфорс 8-символьный пароль. питон - PullRequest
0 голосов
/ 08 июня 2011

Мне нужно написать генератор, который выдает все возможные строки из 8 символов. Из массива символов, таких как:

leters = ['1','2','3','4','5','6','7','8','9','0','q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m']

Скелет выглядит так:

def generator():
    """
    here algorithm
    """
    yield string

предположим, что возвращать список вроде этого ['00000001','00000002','00000003', ......'mmmmmmmm']

Ответы [ 4 ]

6 голосов
/ 08 июня 2011

itertools.combinations() и itertools.combinations_with_replacement() возвращают генератор

>>> letters = ['a', 'b', 'c']
>>> from itertools import combinations

Я использую print() в примерах, чтобы проиллюстрировать вывод. Замените его на yield, чтобы получить генератор.

>>> for c in combinations(letters, 2): 
        print(c)
... 
('a', 'b')
('a', 'c')
('b', 'c')

>>> for c in combinations(letters, 2): 
        print(''.join(c))
... 
ab
ac
bc
>>> 

>>> for c in itertools.combinations_with_replacement(letters, 2): 
        print(''.join(c))
... 
aa
ab
ac
bb
bc
cc

Если вы переборщили его для всех 8-буквенных паролей, содержащих английские буквы и цифры, вам нужно перебрать ~ 2,8 триллиона строк

EDIT Если вы как-то знаете, что повторяющихся элементов нет, используйте permutations

>>> for c in itertools.permutations(letters, 2): 
        print(''.join(c))
... 
ab
ac
ba
bc
ca
cb

это дает вам и ab и ba

Для наиболее общей последовательности грубой силы используйте itertools.product(), как в решении Cosmologicon

6 голосов
/ 08 июня 2011
itertools.product(leters, repeat=8)

РЕДАКТИРОВАТЬ: чтобы он дал вам строки, а не кортежи:

def generator(leters):
    a = itertools.product(leters,repeat=3)
    while a:
        yield "".join(a.next())
2 голосов
/ 08 июня 2011
import itertools
itertools.combinations_with_replacement(leters, 8)

Кстати, у букв есть две буквы.

0 голосов
/ 04 января 2019

Мне было интересно, как это сделать, и это то, что я придумал, я попытался сделать это несколькими способами, но когда я написал это так, это пошло намного быстрее, чем другие ... пожалуйста, lmk, если я не вижу

import string

from itertools import permutations

[print(*p,sep='')for p in permutations(list(string.ascii_letters+string.punctuation+string.digits),8)]
...