Skip to main content
 首页 » 编程设计

Python itertools.combinations 从某个值继续

2025年05月04日14cmt

我使用 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% 

我现在看不到其他解决方案,至少会尝试 bf 5 字节 key 。

请您参考如下方法:

假设处理的最后一个字符串以字符 '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