【问题标题】:Making all possible 6 digit combinations of digits and alphabets制作所有可能的 6 位数字和字母组合
【发布时间】:2015-05-01 15:18:04
【问题描述】:

我正在尝试对我拥有的一个哈希密钥进行暴力破解,密钥是 28 位,我必须找到 6 位密码,包括 0-9 和 az,每个地方总共有 36 种可能性。

我正在使用带有 16gb 内存的 macbook,但是当我运行以下代码时,它需要很长时间并最终终止使用太多内存的过程我想知道的是如何克服它,其次是否有可能而不是等待完成整个循环,然后迭代 abc 以获取所有组合,然后将它们传递给 SHA1 哈希函数,我可以在生成组合时将组合传递给哈希函数

abc = [''.join(i) for i in itertools.product("0123456789abcdefghijklmnopqrstuvwxyz",repeat=6)]

【问题讨论】:

  • 简单地循环 itertools.product 的结果并做任何你需要的计算。

标签: python hash sha1 itertools brute-force


【解决方案1】:

您可以遍历 itertools.product() 返回的对象,就像您实际上已经在使用列表推导式一样,如下所示:

import itertools, string
for i in itertools.product(string.ascii_lowercase+string.digits,repeat=6):
    if check_hash("".join(i)):
        print i
        break

这只会将当前的存储在内存中。

有 (26+10)^6 = 2176782336 种可能性,所以可能还需要一段时间。每个占用 6 个字节,您的原始解决方案使用了 13060694016 个字节,即略多于 12 GB。

我也在使用 Python 2 的 string constants,而不是输入字母和数字。

【讨论】:

  • @PadraicCunningham 我做到了。为了回答您最初的问题,我试图更彻底地解释我的答案。
  • @PadraicCunningham 不,当然它没有提供不同的解决方案。这并不意味着更多的解释是不好的。
【解决方案2】:

不要创建列表,只需遍历 itertools.product object 一次获取一个值,以避免一次将所有值存储在内存中:

for ele in  itertools.product("0123456789abcdefghijklmnopqrstuvwxyz",repeat=6):
    print("".join(ele))

000000
000001
000002
000003
000004
000005
000006
000007
000008
000009
00000a
00000b
00000c
00000d
00000e
00000f
00000g
00000h
00000i
00000j
00000k
00000l
00000m
00000n
00000o
00000p
00000q
00000r
00000s
00000t
00000u
00000v
00000w
00000x
00000y
...............

【讨论】:

  • 我是否只是将每个值一个一个地传递给哈希函数,看看我是否得到匹配,或者是否有更快的替代方案,比如线程或其他东西可以快速找到匹配或其他我不知道的东西'认为线程在这里没有任何用处顺便说一句谢谢你的回答确实解决了我的问题:)
  • 不用担心,是的,只需传递每个值。您可以使用多处理共享迭代器。
  • 您能先让我先了解一下我应该在哪里进行多处理吗?
猜你喜欢
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多