我把密码忘在pdf上了。我记得一些字符,所以我用Python编写了一个简单的密码破解程序。文档现在是否丢失了,给出了组合数?出于好奇,我怎样才能尽可能地加速这个计划呢?
from pikepdf import open
from itertools import product
from math import factorial
c = '12A3ca9€'
c = sorted(set(c))
length = len(c)
total = ( (1-(length**(length+1)))/(1-length) ) - 1
s = 0
for s2 in range(length):
s2 += 1
m = product(c, repeat=s2)
for i in m:
try:
with open(r"C:\Users\User\Desktop\Document.pdf", password=''.join(i)) as pdf:
print(len(pdf.pages))
print(''.join(i))
exit(0)
except:
pass
s+=1
print(100*s/total)发布于 2022-10-18 07:58:55
您的代码将永远不会实际测试任何密码,因为password不是open()的有效参数。因此,对它的每一个调用都会抛出一个TypeError,它被您的裸except子句所吞没。阅读正确的PDF库,这些库支持密码解密,并且除了语句以外,永远不要使用裸的。
发布于 2022-10-17 23:15:30
用C语言重写。
值得注意的是,算法的性能可以提高,但不会增加很多,因为瓶颈肯定是一次又一次地打开文件。
编辑:这是一个奇怪的错误,请参阅@RichardNeumann的答案!
删除s的增量和打印:它在每次迭代中运行,对任何事情都没有贡献。
您可以做s2 += 1,即使s2已经被for循环增加了。这很有误导性。
编辑。感谢@SylvainD!
如果您认为每个符号只出现一次,则可以显着地减少可能性的数量。
如果这不起作用,我已经读到这个工具每秒破解PDF密码的速度是100 K。
请根据变量的实际代表来命名你的变量,即使它只是一个小脚本。我很难读到这篇文章。
发布于 2022-10-18 06:58:41
的回顾
有关Python代码本身的各种详细信息
您的代码看起来很好,并且正确地使用了Python的各种优秀特性:数据类型(如set )和模块(如迭代工具)。
m变量没有那么有用s2的自动增量有点误导.以下是两个替代方案:直接使用s2+1获取product(c, repeat=s2+1)或通过在不同范围内迭代获得s2:for s2 in range(1, length+1)c是一个列表(可能是lst或chars),s是一个计数器(可能是c或nb),s2是一个长度。total的方式可能值得解释。math.factorial''.join(i)可以只计算一次,在try之前r"C:\Users\User\Desktop\Document.pdf"可能在一个常数中except通常被皱眉,因为它们通常比预期的捕捉到的更多,并且也没有给读者提供任何关于被捕捉到的东西的意义。有关更多详细信息,请参阅使用裸露有什么不对?except?。行为的评论
如果我想使用这样的工具,下面是一些我很可能会改变的行为方面。
print将花费一些时间,并且不会给用户提供太多的信息。另一种选择是打印s2:“即将尝试使用长度为X组合的密码进行测试”。sorted(set(c))的字符串似乎非常随意。我的建议是继续使用itertools.count而不是range。https://codereview.stackexchange.com/questions/280535
复制相似问题