Python itertools.combinations继续从某个值?

时间:2016-05-01 15:05:04

标签: python combinations itertools brute-force

我使用itertools生成所有组合或可打印的ascii字符:

for combo in product('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;?@[\\]^_`{|}~ \t\n\r\x0b\x0c', repeat=10):

然而,脚本被中断,但我得到了最后一个序列字符串。有没有办法使用此字符串作为起始序列来继续生成值?谢谢。

UPD:我试图通过强制执行XOR密文来解决一些CTF任务。 Xortool的输出:

 2:   11.2%
   5:   15.6%
   7:   11.2%
  10:   18.4%
  15:   9.6%
  18:   6.6%
  20:   12.1%
  25:   5.8%
  30:   5.5%
  40:   4.0%

我现在看不到其他解决方案,至少会尝试使用5字节密钥。

3 个答案:

答案 0 :(得分:3)

假设已处理的最后一个字符串以字符'5'开头。然后,您可以忽略以前字符开头的所有字符串,并设置迭代,如下所示:

for start in ('567...'):
    for subcombo in product('01234567...', repeat=9):
        yield (start,) + subcombo

但是你真的无法通过这个搜索空间。计算组合总数很容易:

>>> len('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;?@[\\]^_`{|}~ \t\n\r\x0b\x0c') ** 10
73742412689492826049L

虽然即使你可以每秒处理十亿个组合,但你不会在一年内接近:

>>> 1000000000 * 60 * 60 * 24 * 365
31536000000000000

答案 1 :(得分:2)

好的,看,这个问题真的没有意义,因为你的循环可能比你的计算机运行的时间更长,但无论如何我都有答案!

你的循环产生这样的元组:

('0', '0', '0', '0', '0', '0', '1', 'C', '!', 'D')

让我们说这是你在之前的比赛中看到的最后一个。所以写下你的代码:

resume_target = ('0', '0', '0', '0', '0', '0', '1', 'C', '!', 'D')
sequence = product(all_those_letters, repeat=10)
for combo in sequence:
    if combo == resume_target:
        break

for combo in sequence:
    # now do whatever you'd normally do

我在这里所做的只是简单地“快进”#34;然而,通过第一次计算的计算量最小 - 之前处理了许多组合。这很简单,也应该是正确的,但它确实假设你对每个组合做了大量的工作 - 否则它对于快进是毫无意义的,因为你可能只是做了一些微不足道的工作。

答案 2 :(得分:1)

它可能不会很快但是itertools.islice你可以跳过它们的前n个:

c = itertools.islice(itertools.product('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;?@[\\]^_`{|}~ \t\n\r\x0b\x0c', repeat=10), 5, None)
c.next()
Out[39]: ('0', '0', '0', '0', '0', '0', '0', '0', '0', '5')