2016-10-26 34 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

'信件= [str(i)我在范围内('a,b,c,d,e, f,g,h,i,j,k,l,m,n,o,p')]'不会像你想的那样工作.... – MooingRawr

回答

4

这里是一个令人讨厌的蛮力方法,它会猜测num (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,attempts)'行来抑制输出。然后它会运行直到它找到一个匹配返回最后的猜测和计数。 – CoryKramer

+0

非常感谢你,这个解决方案的工作原理,并得到了你的一个一个答案(现在我可以做一个程序数字,字母和字母数字密码!)祝你有美好的一天。 –

0

一个可能的选项,它会保留几乎一模一样您当前的代码转换为与下面的“数字”基地36: 0-9a-z。如果您在range(36**n)中搜索,这将为您提供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

谢谢你的评论!我理解你说的要点,但作为初学者,我不确定我需要将函数转换为范围(我认为你应该这样做)。 –