2016-10-26 12 views
0

Мне нужно сделать небольшие программы для школы, чтобы грубой силой взломать разные типы паролей; Я ищу, чтобы создать код python с грубой силой, который будет проходить через все возможные комбинации алфавитных и буквенно-цифровых паролей и дать мне пароль и время, необходимое для взлома.Как создать взломщик паролей Bruteforce для алфавитных и буквенно-цифровых паролей?

Я сделал то же самое с чисто числовых паролей и получил это:

import datetime as dt 

Password4 = 123456 

def crack_password(): 
    start = dt.datetime.now() 
    for n in range(1000000): 
     password_guess = '{0:04d}'.format(n) 
      if password_guess == str(Password4): 
       end = dt.datetime.now() 
       print("Password found: {} in {}".format(password_guess, end - start)) 
       break 
    guesses = crack_password() 

Затем я попытался сделать что-то немного похожее на алфавит/буквенно-цифровые пароли, но не получилось, что я пробовал:

import random 

    letters = [str(i) for i in range('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p')] 
    s = [''.join([a,b,c,d,e,f,g,h]) for a in letters for b in letters for c in letters for d in letters for e in letters for f in letters for g in letters for h in letters] 
    random.shuffle(s) 
    real_password = 'aaaaaaaa' 
    i = 0 

    for code in s: 
     if code == real_password: 
      print() 
      print('The password is: ', code) 
      break 
     else: 
      i += 1 
      print(i, ' failures', end='\r') 

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

Пожалуйста, обратите внимание: Я довольно новый для кодирования, и я очень благодарен за вашу помощь :)

+0

Я предлагаю вам взглянуть на это PHP скрипт, я считаю, это хорошо написано: https://gist.github.com/popc0rn/5859209 –

+0

спасибо @ YannChabot, однако я ищу эту программу на python и не знаю, как переводить между разными языками –

+0

'letters = [str (i) для i в диапазоне ('a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p ')] 'не работает, как вы думаете .... – MooingRawr

ответ

4

Ниже приведен алгоритм грубой силы, (string.digits) и строчные буквы (string.ascii_lowercase). Вы можете использовать itertools.product с repeat, установленным для текущей длины пароля. Вы можете начинать с 1 паролей символов (или как бы то ни было с вашей нижней границей), затем также закрывайте его на максимальной длине. Затем только return, когда найдете матч.

import itertools 
import string 

def guess_password(real): 
    chars = string.ascii_lowercase + string.digits 
    attempts = 0 
    for password_length in range(1, 9): 
     for guess in itertools.product(chars, repeat=password_length): 
      attempts += 1 
      guess = ''.join(guess) 
      if guess == real: 
       return 'password is {}. found in {} guesses.'.format(guess, attempts) 
      print(guess, attempts) 

print(guess_password('abc')) 

Выход

a 1 
b 2 
c 3 
d 4 
... 
aba 1369 
abb 1370 
password is abc. found in 1371 guesses. 
+0

Спасибо большое! Когда я превысил 4 символа в пароле, моя IDE сообщила, что есть «слишком большой результат». Он по-прежнему работает, но занимает гораздо больше времени. Является ли это чем-то, с чем мне просто нужно иметь дело, поскольку это программа грубой силы? –

+0

Просто удалите строку 'print (guess, попытка)' для подавления вывода. Затем он будет запускаться, пока не найдет совпадение с возвратом окончательного догадки и подсчета. – CoryKramer

+0

Большое вам спасибо, это решение работает и получил от вас один ответ (теперь я могу делать числовые, алфавитные и буквенно-цифровые пароли с одной программой!) У вас прекрасный день. –

0

Один из возможных вариантов, который позволит сохранить почти точно ваш текущий код, чтобы преобразовать базу 36 со следующей «цифрой»: 0-9a-z. Это даст вам любую возможную буквенно-цифровую комбинацию для n символов, если вы выполните поиск в range(36**n).

Используя упрощенную функцию от How to convert an integer in any base to a string?:

def baseN(num, b=36, numerals="abcdefghijklmnopqrstuvwxyz"): 
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b]) 

Вы можете перебрать числа, как в вашем примере:

>>> for i in range(10000, 10005): 
...  print(baseN(i).zfill(5)) 
... 
007ps 
007pt 
007pu 
007pv 
007pw 

Чтобы получить все возможности 3-х букв, вы можете петли следующим образом:

for i in range(36**3): 
    possible = baseN(i).zfill(3) 
+0

Спасибо за ваш комментарий! Я понимаю суть того, что вы говорите, но поскольку я новичок, я не уверен, где мне нужно включить функцию для преобразования диапазона (я думаю, это то, что вы говорите, что я должен делать)? –

 Смежные вопросы

  • Нет связанных вопросов^_^