[MTC3]Cracking SHA1-Hashed Passwords

[MTC3]Cracking SHA1-Hashed Passwords

网上有用八重循环的,非常不优雅。。。

首先,我们知道密码是由给定字符集的字符组成的,每个字符都有两种可能的选择。这就形成了一个二叉树,其中每个节点都代表一个字符的选择,树的深度等于字符集的大小。

然后,我使用深度优先搜索(DFS)来遍历这个二叉树。DFS是一种用于遍历或搜索树或图的算法。在这个场景中,我从树的根节点开始,沿着一条路径向下搜索,直到达到一个叶节点,也就是一个可能的密码组合。

对于每一个叶节点,我使用itertools.permutations来生成所有可能的排列,然后计算每个排列的SHA1哈希值,与给定的哈希值进行比较。

如果找到了一个匹配的哈希值,我就立即停止搜索,并打印出对应的密码和搜索所用的时间。这样,一旦找到答案,就不需要再继续搜索了,这大大提高了代码的效率。

#coding:utf-8
import hashlib
import itertools
import datetime

def sha_encrypt(str):
    sha = hashlib.sha1(str.encode())
    encrypts = sha.hexdigest()
    return encrypts

def dfs(idx, path, str2, hash1):
    if idx == len(str2):
        for p in itertools.permutations(path):
            if sha_encrypt("".join(p)) == hash1:
                print("".join(p))
                print((datetime.datetime.now() - starttime).seconds)
                return True
        return False

    for i in range(2):
        if dfs(idx + 1, path + [str2[idx][i]], str2, hash1):
            return True
    return False

starttime = datetime.datetime.now()
hash1="67ae1a64661ac8b4494666f58c4822408dd0a3e4"
str2=[['Q', 'q'],[ 'W', 'w'],[ '%', '5'], ['8', '('],[ '=', '0'], ['I', 'i'], ['*', '+'], ['n', 'N']]

dfs(0, [], str2, hash1)

你可能感兴趣的:(算法)