【问题标题】:Calling list in a list of list of dictionary not working在字典列表列表中调用列表不起作用
【发布时间】:2019-05-30 15:20:45
【问题描述】:

逻辑

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

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。

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

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

【问题讨论】:

  • 什么是hashdict?请提供所有相关代码,这里似乎不足以对正在发生的事情和预期结果做出合乎逻辑的假设。另外,您不能“call”列表...这是什么意思?
  • 请添加输入和所需的输出。帮助更容易。
  • @Jab >> 感谢您的回复。我已经用相关代码编辑了整个问题。主要思想是让用户输入一个哈希,然后脚本使用字符串长度检测哈希的类型,并相应地运行不同的函数列表来破解每种类型的哈希。
  • @Error-SyntacticalRemorse >> 感谢您的回复,我已经用相关代码编辑了整个问题。

标签: python dictionary


【解决方案1】:

看来你真的把这个复杂化了,你似乎正在做的就是如果输入的长度与预定义的数字匹配,然后调用 api 传递输入的字符串和函数列表,然后返回它的值,否则返回假的。

只需制作一个如下所示的字典:

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 函数中,只需使用len(hash_value) 调用.get 并在dict 中返回值,否则返回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

或者甚至更好的是像这样将实际方法放在 dict 中(为了空间,我在这里使用 lambdas,不过,为了便于阅读,我建议使用实际函数):

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)

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2022-12-01
    • 2018-02-06
    • 2020-05-11
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多