gpt4 book ai didi

python - 字典列表列表中的调用列表不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:38 26 4
gpt4 key购买 nike

逻辑

每个列表中都有不同的函数名称,如下所示:

md5 = [gamma, alpha, beta, theta, delta]
sha1 = [alpha, beta, theta, delta]
sha256 = [alpha, beta, theta]
sha384 = [alpha, beta, theta]
sha512 = [alpha, beta, theta]

也就是说,如果一个函数是调用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.

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 哈希,而所有其他哈希将导致哈希不支持打印。

我不知道为什么它会忽略第一个字典列表项之后的任何内容。

最佳答案

看起来你真的把这个复杂化了,你所做的一切似乎是如果输入的长度与预定义的数字匹配然后调用 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 函数中调用 .getlen(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)

关于python - 字典列表列表中的调用列表不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56334651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com