Python перебор паролей - PullRequest
       11

Python перебор паролей

0 голосов
/ 07 мая 2018

Я делаю задание в классе о пароле. Я столкнулся с множеством проблем, пытаясь решить эту задачу, мой первый подход состоял в том, чтобы использовать циклы for (код ниже), но я понял, что количество циклов for равно длине строки.

a_z = 'abcdefghijklmnopqrstuvwxyz'
pasw = 'dog'
tests = 0
guess = ''
azlen = len(a_z)

for i in range(azlen):
    for j in range(azlen):
        for k in range(azlen):
            guess = a_z[i] + a_z[j] + a_z[k]
            tests += 1
            if guess == pasw:
                print('Got "{}" after {} tests'.format(guess, str(tests)))
                break

input()

Программа выше очень конкретная. Работает только если введено ровно 3 символа. Я читал, что вы можете использовать пакет под названием intertools, однако я действительно хочу найти другой способ сделать это. Я думал об использовании рекурсии, но даже не знаю, с чего начать.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Если вы не хотите использовать itertools, вы, безусловно, можете сделать это с помощью рекурсии, которая будет работать с паролями любой (разумной) длины - она ​​не привязана к трем символам. По сути, каждый рекурсивный вызов будет пытаться добавить новый символ из вашего алфавита к вашему текущему значению догадки. Базовый случай - это когда догадка достигает той же длины, что и искомое значение, и в этом случае вы проверяете соответствие. Если совпадение найдено, верните признак того, что вы добились успеха (я использовал return True), чтобы вы могли закорачивать любой дальнейший поиск. В противном случае верните сообщение об ошибке (return False). Использование счетчика global делает его немного страшнее, но дает те же результаты, о которых вы сообщали.

ALPHABET = 'abcdefghijklmnopqrstuvwxyz'

def brute_force_guesser(passwd, guess = ''):
    global _bfg_counter
    if len(guess) == 0:
        _bfg_counter = 0
    if len(guess) == len(passwd):
        _bfg_counter += 1
        if guess == passwd:
            print('Got "{}" after {} tests'.format(guess, str(_bfg_counter)))
            return True
        return False
    else:
        for c in ALPHABET:
            if brute_force_guesser(passwd, guess + c):
                return True
        return False

brute_force_guesser('dog')    # => Got "dog" after 2399 tests
brute_force_guesser('doggy')  # => Got "doggy" after 1621229 tests

Одним из способов избежать глобального счетчика является использование нескольких возвращаемых значений:

ALPHABET = 'abcdefghijklmnopqrstuvwxyz'

def brute_force_guesser(target, guess = '', counter = 0):
    if len(guess) == len(target):
        counter += 1
        if guess == target:
            print('Got "{}" after {} tests'.format(guess, str(counter)))
            return True, counter
        return False, counter
    else:
        for c in ALPHABET:
            target_found, counter = brute_force_guesser(target, guess + c, counter)
            if target_found:
                return True, counter
        return False, counter

brute_force_guesser('dog')    # => Got "dog" after 2399 tests
brute_force_guesser('doggy')  # => Got "doggy" after 1621229 tests
0 голосов
/ 09 мая 2018

Вот мой полный ответ, извините, если он не аккуратный, я все еще новичок в кодировании в целом. Благодарность принадлежит @JohnColeman за отличную идею использования баз.

import math
global guess

pasw = str(input('Input password: '))
chars = 'abcdefghijklmnopqrstuvwxyz' #only limeted myself to lowercase for simplllicity.
base = len(chars)+1

def cracker(pasw):
    guess = ''
    tests = 1
    c = 0
    m = 0

    while True:
        y = tests
        while True:
            c = y % base
            m = math.floor((y - c) / base)
            y = m
            guess = chars[(c - 1)] + guess
            print(guess)
            if m == 0:
                break

        if guess == pasw:
            print('Got "{}" after {} tests'.format(guess, str(tests)))
            break
        else:
            tests += 1
            guess = ''


cracker(pasw)
input()
0 голосов
/ 07 мая 2018
import string
import itertools

for possible_password in itertools.permutations(string.ascii_letters, 3): 
    print(possible_password)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...