MD5 Python强力错误

时间:2014-11-29 01:34:08

标签: python python-2.7 hash md5

我已经用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循环来重复代码。非常感谢。

1 个答案:

答案 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'