每个列表中都有不同的函数名称,如下所示:
md5 = [gamma, alpha, beta, theta, delta]
sha1 = [alpha, beta, theta, delta]
sha256 = [alpha, beta, theta]
sha384 = [alpha, beta, theta]
sha512 = [alpha, beta, theta]
这意味着,如果for的函数要调用 md5 列表,则md5列表中的所有函数都将运行。
将根据列表字典调用这些列表之一。但是为了确定要采用的功能列表,有一个这样创建的字典:
hashdict = {}
hashdict['md5'] = [ 'md5' , 32 , md5 ]
hashdict['sha1'] = [ 'sha1' , 40 , sha1 ]
hashdict['sha256'] = [ 'sha256' , 64 , sha256 ]
hashdict['sha384'] = [ 'sha384' , 96 , sha384 ]
hashdict['sha512'] = [ 'sha512' , 128 , sha512 ]
此函数接收用户提交的哈希,检查字符串长度是否等于hashdict {}内任何字典列表中的长度。例如,如果长度匹配:32个字符,则它将为md5哈希。
在脚本知道字典中的正确列表之后,它将从hashdict的特定列表中获取函数(列表的第三个列表项-列表的第二个索引),并将其传递给名为 api <的函数调用/ em>。
def crack(hashvalue):
result = False
hashInDict = False
for hashList in list(hashdict.values()):
if len(hashvalue) in hashList:
hashInDict = True
if not file:
print(f'{info} Hash Function : {hashList[0].upper()}')
for api in hashList[2]:
r = api(hashvalue, hashList[0])
if r:
return r
else:
if hashInDict == False:
if not file:
print(f'{bad} This hash type is not supported.')
quit()
else:
return False
仅当散列为md5并且传递的任何其他散列导致消息“不支持此散列类型”时,它才起作用。不知何故。如果我删除字典并使用if-else来比较哈希字符串的长度,则一切正常。但是,使用字典列表会导致所有其他哈希被忽略,只有第一个字典列表可以工作。
如果我将第一个字典列表替换为例如sha1,则将仅检测到sha1哈希,所有其他哈希将导致不支持哈希的打印。
我不知道为什么它忽略了第一个字典列表项之后的任何内容。
答案 0 :(得分:1)
这似乎使您复杂化了,您似乎要做的就是输入的长度与预定义的数字匹配,然后调用api
传递输入的字符串和函数列表,然后返回其值否则返回False。
只需做出一个像这样的字典:
hash_dict = {
32: [gamma, alpha, beta, theta, delta],
40: [alpha, beta, theta, delta],
64: [alpha, beta, theta],
96: [alpha, beta, theta],
128: [alpha, beta, theta]
}
然后在crack
函数中仅用.get
调用len(hash_value)
,并在字典中返回值,否则返回None或指定的默认值。
def crack(hash_value):
hash_list = hash_dict.get(len(hash_value))
if hash_list:
return api(hash_value, hash_list)
return False
我在这里假设api
的功能,但是如果只是通过列表中的每个函数传递数据,那么在crack
中很容易做到。代替return api(hash_value, hash_list)
使用:
for func in hash_list:
hash_value = func(hash_value)
return hash_value
甚至最好将实际方法放入这样的字典中(为了节省空间,我在这里使用lambda,尽管如此,我建议使用实际函数以提高可读性):
hashdict = {
32: lambda x: gamma(alpha(beta(theta(delta(x)))))
40: lambda x: alpha(beta(theta, delta(x))),
64: lambda x: alpha(beta(theta(x))),
96: lambda x: alpha(beta(theta(x))),
128: lambda x: alpha(beta(theta(x)))
}
然后只需执行以下操作:
def crack(hash_value):
def _default(_): False
hash_func = hash_dict.get(len(hash_value), _default)
return hash_func(hash_value)