生成巨大词表的算法

标签 algorithm md5 permutation

好吧,我知道这听起来很糟糕,就像我要把它用于不道德的事情一样,但我向您保证我不会。

我正在为我的计算机和信息安全类(class)写一篇论文,我选择的主题是哈希方法。我在论文中提到的一个要点是 MD5 只是单向的,破解 MD5 哈希的唯一方法是连续生成字符串并使用 MD5 函数,然后将它与你想要破解的哈希进行比较。

我想构建一个非常简单的模型程序来展示我的论文(我们做了一个演示,这将是一件很棒的事情),所以我想制定一个算法来制作一个字符串可能的字符组合最多 8 个字符。例如输出将是:

a, b, c, ..., aa, ab, ac, ... ba, bb, bc 等等等等

如果可能,它需要包含字母、数字和符号。

我部分通过了算法,但遗憾的是我的编程技能无法胜任这项任务。如果有人能为此提供完整的算法,我将非常感激。

再次声明,如果您认为我是个骗子并且我打算将此用于黑客目的,您不必留下答案。

谢谢。 :)

最佳答案

在 Python 中,itertools.product几乎可以满足您的所有需求——尽管它只执行一个“重复次数”,因此您必须从 1 迭代到 8(不难;-)。本质上:

import itertools
import string

# whatever you wish as alphabet (lower/upper, digits, punct, &c)
myalphabet = string.ascii_lowercase + string.ascii_digits

def prods(maxlen, alphabet=myalphabet):
  for i in range(1, maxlen+1):
    for s in itertools.product(alphabet, repeat=i):
      yield ''.join(s)

当然,对于长度为 N 和 K 次重复(在您的情况下为 8 次)的字母表,这确实会产生 N + N^2 + ... + N^K 种可能性(N=36 和 K=8 时有 2,901,713,047,668 种可能性) , 但是, friend 之间几万亿输出算什么!-)

关于生成巨大词表的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1656334/

相关文章:

php - WordPress MD5 密码

md5 - swift语言中CC_MD5方法的使用方法

algorithm - 回溯的替代方法

MySQL更新另一列的md5

c# - 生成集合的排列(最有效)

JavaScript - 从字典键生成组合并动态保留键名

c++ - 在 C++ 中生成排列的递归问题

python - 使用堆有助于提高字符串重新排列的性能

algorithm - 金字塔算法

algorithm - 如何计算两种算法的总大 O 值——是否只是 O(|f1| + f|2|)?