【发布时间】:2013-11-25 16:40:36
【问题描述】:
我已根据该站点上另一个用户编写的不同脚本修改了此脚本。我试图尽我所能理解它,但我遇到了困难。当我尝试使用 charset 作为可能仅小写字母来破解哈希时,它工作得很好。但是当我尝试破解包含数字和字母的哈希时,除非我将“spc”变量从 1000000 增加到 100000000,否则它将无法工作。
import itertools
import math
import string
import multiprocessing
import hashlib
import traceback
import sys
def hashstring(string, algorithm):
return hashlib.new(algorithm, string).hexdigest()
def gen_product(prefix, charset, length):
for string in itertools.product(charset, repeat=length):
yield prefix + "".join(string)
def string_generator(prefix, hash, suffix_length, length, charset, hashalg):
num_done = 0
if length <= suffix_length:
assert prefix == ""
for possible in gen_product("", charset, length):
if hashstring(possible, hashalg) == hash:
return possible
else:
assert len(prefix) + suffix_length == length
for possible in gen_product(prefix, charset, suffix_length):
if hashstring(possible, hashalg) == hash:
return possible
return None
def run_string_generator(*args):
try:
return string_generator(*args)
except:
raise Exception("".join(traceback.format_exception(*sys.exc_info())))
def do_work(pool, hash, charset, length, hashalg, spc=100000000):
n = len(charset)
suffix_len = int(math.ceil(math.log(spc) / math.log(n)) - 1)
max_short_len = min(suffix_len, length)
for length in range(1, max_short_len + 1):
result = pool.apply_async(run_string_generator, args = ("", hash, suffix_len, length, charset, hashalg))
if result.get() != None:
return result.get()
for length in range(max_short_len + 1, length + 1):
for prefix in gen_product("", charset, length - suffix_len):
result = pool.apply_async(run_string_generator, args = (prefix, hash, suffix_len, length, charset, hashalg))
if result.get() != None:
return result.get()
return None
def parallel_bruteforce(hash, charset, length, hashalg="md5", spc=1000000, cores=None):
pool = multiprocessing.Pool(cores)
result = do_work(pool, hash, charset, length, hashalg, spc)
pool.close()
pool.join()
return result
if __name__ == "__main__":
print "Starting..."
#The hash is an md5 encryption of "test1"
print parallel_bruteforce("5a105e8b9d40e1329780d62ea2265d8a", string.ascii_lowercase + string.digits, 5, spc=100000000)
编辑: 原始代码的另一篇文章的链接是https://stackoverflow.com/a/20135250/1769995
【问题讨论】:
-
Python 绝对不是最好的语言。
-
@Blender 这只是一个学习练习,python 是我最了解的语言。我不在乎速度。
-
“它不起作用”究竟是什么意思?我没心情瞎猜 ;-)
-
看起来它只是搜索键空间的一部分而不是全部。
-
@Blender,但 CPython 的 md5 摘要计算是用 C 实现的,从 LibTomCrypt 借来的。 Python 代码只是生成要提供给它的字符串。当然,这可以更快地完成——即使在 Python 中也是如此;-)
标签: python parallel-processing multiprocessing