我正在尝试强制使用受3个字符密码保护的RAR存档:
import os
Alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for a in range(0,26):
for b in range(0,26):
for c in range(0,26):
Brute = Alphabets[a] + Alphabets[b] + Alphabets[c]
os.popen4("Rar.exe x -p" + Brute + " Protected.rar")
# raw_input()
raw_input("Done !")
代码工作正常,除了:它非常慢!!
我认为让它变慢的原因是“popen4”的多重开放。因为我试图将生成的单词存储在txt文件中,程序在不到5秒的时间内完成。
任何提高绩效的想法?
答案 0 :(得分:7)
您可以使用(或学习)rarcrack。它是用C语言编写的,在Linux上编译没有问题(Windows有很多变化)。
通常,为每个测试密码打开一个进程非常昂贵。您应该尝试自己打开存档,然后测试所有密码。无论如何,你需要测试rar.exe的返回值,以确定提取是否成功。
为了获得最佳性能,您应该用C(或类似的)编写程序。有一个名为“libunrar”的Linux软件包可以帮助您打开RAR文件。
答案 1 :(得分:5)
您可以考虑使用一些stdlib模块:
>>> import string
>>> import itertools
>>> from subprocess import Popen, PIPE
>>> for i in itertools.product(string.ascii_uppercase, repeat=3):
pr = Popen(['rar.exe', 'x', '-p', ''.join(i), 'protected.rar'], stdin=PIPE, stdout=PIPE)
pr.communicate()
它可能不一定能提高性能,但它确实可以使您的代码更清晰。
答案 2 :(得分:3)
生成密码非常简单,这就是创建26 ^ 3 = 17576密码只需5秒钟的原因。花费最多时间的是打开并尝试解密存档 - 而您无法控制存档。
关于加速这一点你没有什么可做的 - rar二进制文件和输入文件将在前几次尝试后缓存在内存中:只需让它在一夜之间运行或根据需要运行。 / p>
答案 3 :(得分:0)
首先生成密码然后并行化rar.exe进程调用(这似乎是瓶颈)怎么样?
答案 4 :(得分:0)
您可能无法减少尝试解密存档所需的时间,但是,假设密码不是完全随机的(可能是密码),您可能会获得更多正确的密码如果您订购字母的使用可能性降低,请很快。
例如,在Linux Journal中,shell脚本列分析了一些大文本以确定e,t,a,o,n,i,s,r,h和d是这些文本中最常见的字母(并且可能这与整个英语接近)。所以改变你的第二行:
Alphabets = "ETAONIBSRHDCFGJKLMPQUVWXYZ"
可能会导致您的算法以较少的迭代次数到达密码。
编辑:第二个想法 如果密码是,如某人指示的那样,“cat”,原始排序将需要3次通过外部循环,而新版本将需要11次传递,因此在这种情况下,它将无法更快地解决它。因此,您可能需要通过尝试预测最可能的第一个字母来优化外部循环列表。