我已经用python编写了一段时间,并决定制作一个MD5暴力破解者。这是我的代码
import hashlib
import sys
import os
import time
import urllib2
import urllib
import re
import string
import random
from itertools import islice
string = raw_input("HASH TO DECRYPT: ")
size = input("PASSWORD LENGTH: ")
char_list = ("a")
def random_char(size):
selection = iter(lambda: random.choice(char_list),object())
while True:
yield ''.join(islice(selection, size))
random_gen = random_char(size)
def encrypt(random_gen):
algorithim = hashlib.md5()
algorithim.update(random_gen)
encrypted=algorithim.hexdigest()
def dosethestringexisit():
if encrypt(random_gen) == string :
print next(random_char)
else:
print("pass not found")
print dosethestringexisit()
我遇到过一些问题,比如这个错误
algorithim.update(random_gen)
TypeError: must be string or buffer, not generator
我不知道如何更改随机生成的字符串以适应algorithm.update()。
请注意,char列表只是“a”,因为我使用md5哈希“a”来测试代码是否有效。
此外,我想知道如果随机散列不等于需要解密的散列,如何使用while循环来重复代码。非常感谢。
答案 0 :(得分:3)
要从生成器获取项目,您需要使用next
函数:
def encrypt(random_gen):
algorithim = hashlib.md5()
algorithim.update(next(random_gen))
encrypted=algorithim.hexdigest()
您还可以使用next
方法(或Python 3.x中的__next__
方法):
algorithim.update(random_gen.next())
以上将解决异常。
BTW,代码使用string
作为变量名。这会影响模块string
;防止使用该模块。使用不同的变量名称。
蛮力意味着尝试所有可能的输入;而不是使用随机,使用itertools.product
,您可以获得所有字符串:
>>> import hashlib
>>> import itertools
>>> import string
>>>
>>> def dosethestringexisit(target, size):
... for xs in itertools.product(string.ascii_letters, repeat=size):
... s = ''.join(xs)
... if hashlib.md5(s).hexdigest() == target:
... return s
...
>>> dosethestringexisit('912ec803b2ce49e4a541068d495ab570', 4)
'asdf'