字典列表列表中的呼叫列表不起作用

时间:2019-05-28 03:33:47

标签: python dictionary

逻辑

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

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

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

1 个答案:

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