Python生成所有长度为n的可能字符串

7

我正在学习道德黑客技术。我有一个密码的哈希密钥和加密算法(sha256 / sha512)。我想从文件中解析所有字符串,并检查密码的哈希是否与文件中每个字符串的哈希匹配。

生成的字符串可能包含小写字母、大写字母和数字。

有什么办法可以生成长度为n的所有可能包含字母和数字的字符串吗?


1
使用 itertools.product(并带有 repeat=n)可能会很方便。 - CristiFati
1
没有结构上的差异,你只需要扩展字母表即可。 - languitar
1
一个更好的方法是使用常用密码列表,可以参考SecLists - zaph
有趣的链接。无论如何我想自己实现。另外,当有密码验证规则时,生成所有可能的字符串然后检查它们可能会更容易。 - Andrew T
1
对于一个8个字符的密码,大约有100,000,000,000,000种可能性。另请参见:Infosec password-cracking-tools
高级密码恢复hashcat
- zaph
显示剩余2条评论
3个回答

9
这是一段使用 [Python 3.Docs]: itertools.product(*iterables, repeat=1) 的代码。请注意,生成的字符串数量为 62 ** length, 因此为了测试目的,请使用 较小的值 来设置 length
import string
import itertools


def generate_strings(length=3):
    chars = string.ascii_letters + string.digits  # "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    for item in itertools.product(chars, repeat=length):
        yield "".join(item)

计数变量是什么? - Andrew T
它是 n(生成的字符串长度)。 - CristiFati

5
您可以使用 itertools.product
print([''.join(x) for x in itertools.product('abcABC123', repeat=3)])
['aaa',
 'aab',
 'aac',
 'aaA',
 'aaB',
 'aaC',
 'aa1',
 'aa2',
 'aa3',
 'aba',
...

只需将您需要的其余字符添加到输入字符串中。 您可以使用 strings 模块中的常量来实现这一点。

请注意,这会快速增加。 ;)


2
使用 itertools.product
from itertools import product
from string import ascii_letters, digits

for i in product(ascii_letters + digits, repeat=n):
    print(''.join(i))

1
这将仅生成每个字母最多出现一次的字符串。 - languitar
排列不允许重复的字母,对吗?你是不是想用"itertools.combinations_with_replacement"? - jakevdp
你说得对,应该是产品。 - Patrick Haugh
1
如果不指定repeat=n,那么会引发TypeError吗? - CristiFati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接