我使用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字节密钥。
答案 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')