27

特定の文字セットから特定の範囲まで、可能なすべての組み合わせを生成する必要があります。お気に入り、

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

そしてアウトプットは、

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

既に使用されているライブラリを使用してこれを実行できることはわかっていますが、それらが実際にどのように機能するかを知る必要があります.Pythonまたは読み取り可能なプログラミング言語でこの種のアルゴリズムのコメント付きコードを誰かに教えてもらえれば、とても感謝しています.

4

10 に答える 10

56

を使用してitertools.product、 と組み合わせてitertools.chain、さまざまな長さをまとめます。

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

デモンストレーション:

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

これにより、最大長 maxlength まで、入力セットを使用して段階的に大きな単語が効率的に生成されます。

長さ 10 までの 26 文字のメモリ内リストを生成しようとしないでください。代わりに、生成された結果を反復処理します。

for attempt in bruteforce(string.ascii_lowercase, 10):
    # match it against your password, or whatever
    if matched:
        break
于 2012-07-31T19:19:34.553 に答える
25

本当にブルート フォースしたい場合は、これを試してください。ただし、途方もない時間がかかります。

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

list = 'ab' で 5 までしかない小さな例では、次のように表示されます。

['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']
于 2012-07-31T19:17:14.167 に答える
5

itertools を使用して辞書を作成する別の非常に簡単な方法を見つけました。

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

これは、「a」、「b」、「c」、および「d」のすべての組み合わせを反復処理し、合計の長さが 1 から 4 の組み合わせを作成します。a,b,c,d,aa,ab.........,dddc,dddd. generator は itertool オブジェクトであり、次のように通常どおりループできます。

for password in generator:
        ''.join(password)

各パスワードは事実上タプル型であり、通常どおりに作業できます。

于 2016-12-26T18:18:39.973 に答える
3

itertoolsこれには理想的に適しています:

itertools.chain.from_iterable((''.join(l)
                               for l in itertools.product(charset, repeat=i))
                              for i in range(1, maxlen + 1))
于 2012-07-31T19:21:25.783 に答える
3

再帰を使用したソリューション:

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

使用法:

brute("", 4, "rce")
于 2016-05-08T23:56:00.860 に答える
3

ブルートフォース アルゴリズムが本当に必要な場合は、MemoryError でクラッシュする遅いアルゴリズムが必要でない限り、コンピュータのメモリに大きなリストを保存しないでください。

次のように itertools.product を使用してみてください。

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)入力したイテラブルのデカルト積を返します。

[i for i in product('bar', (42,))]例を返します[('b', 42), ('a', 42), ('r', 42)]

パラメータを使用すると、repeatあなたが求めたものを正確に作ることができます:

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

戻り値

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

:

ブルート フォース アルゴリズムが欲しかったので、あなたに渡しました。現在、パスワードが指数関数的に増加するため、パスワードが大きくなり始めると非常に長い方法になります (「解決済み」という単語を見つけるのに 62 秒かかりました)。

于 2018-01-22T19:34:43.317 に答える
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()
于 2017-03-10T15:46:54.613 に答える
0

これを試して:

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)
于 2015-01-12T22:29:53.000 に答える