Python - 蛮力生成器

Python - Brute force generator

我制作了一个可以工作的强力密码破解器,但我还制作了一个字符串组合生成器,作为强力字符串生成器会更好;但是我不知道如何将两者结合起来。

暴力破解代码:

import random

characters = "ABCDE"
length = 5
while True:
    pw = ""

   #Generating Section
    for i in range(length):
        next_index = random.randrange(len(characters))
        pw = pw + characters[next_index]

    if pw == "ABCDE":
        print()
        print()
        print("Password acquired.")
        break

字符生成器代码:

import itertools

res = itertools.permutations(test ,length)
for i in res: 
    print(''.join(i))

我想用改进的生成器代码替换暴力破解代码中的 "Generating" 部分,但我做不到。请帮忙。

我更改了您的代码以使用 itertools 并使用 generator 遍历可能的密码,这样您就不会进行超出需要的计算。

import itertools

characters = "ABCDE"
length = 5
done = False

while True:
    def pw_guess():
        res = itertools.permutations('ABCDE' ,5)
        for guess in res:
            yield guess

    #Make generator object
    guess_generator = pw_guess()

    for guess in guess_generator:
         if guess == ('A', 'B', 'C', 'D', 'E'):
            print()
            print("Password acquired: " + str(guess))
            done = True
            break
    if done:
        break

生成器逐个计算猜测值,而不是提前计算。

老实说,我已经制作了一个不需要那么多代码的强力程序。我的代码中的某些行是可选的(例如计算猜测密码的尝试次数。)。试试我的代码:

import random
import string
guessAttempts = 0
myPassword = input("Enter a password for the computer to try and guess: ")
passwordLength = len(myPassword)
while True:
    guessAttempts = guessAttempts + 1
    passwordGuess = ''.join([random.choice(string.ascii_letters + string.digits)for n in range(passwordLength)])
    print(passwordGuess)
    if passwordGuess == myPassword:
        print("Password guessed successfully!")
        print("It took the computer %s guesses to guess your password." % (guessAttempts))
        break

我使用 itertools.product 从 [a-z, 0-9] 列表中生成任意长度的密码。最后一个循环中的 1800 用于我的测试。

import itertools
char_set = [chr(_) for _ in list(range(ord('a'), ord('z')+1))] + [chr(_) for _ in list(range(ord('0'), ord('9')+1))]

def my_fun(alphanum):
    i = 0
    while True:
        result = itertools.product(alphanum, repeat=i)
        for guess in result:
            yield guess
        i += 1

g = my_fun(char_set)
for c in range(1800):
        print((''.join(next(g))))