我有一个关于使用python破解zip文件密码的任务。这不是不道德或非法的破解项目,而是学校的任务。我想问一下如何生成密码并一步一步地进行测试?即首先生成密码“ 0”,然后测试ingit,如果未成功破解,则将生成第二个密码“ 1”并再次进行测试。
我有一些代码,但是问题是它只在生成大量密码后才开始破解zip文件。例如,我将其设置为从'0000'到'9999'生成,当我运行代码时,它将生成从'0000'到'9999'的所有密码,然后它将开始破解zip文件。
这是我的代码:
import zipfile
from datetime import datetime
from itertools import product
import itertools
str_09 = "0123456789"
file_pwd = 'password/pwd-str_09-8.txt'
mystring = str_09
myfile = open(file_pwd, 'w')
for a in range(1,6):
for i in itertools.product(mystring, repeat=a):
myfile.write("%s\n" % ''.join(map(str, i)))
myfile.close()
file_pwd = 'password/pwd-str_09-8.txt'
zip_file_created_a = 'file/a5.zip'
count = 1
with open(file_pwd,'rb') as text:
for entry in text.readlines():
password = entry.strip()
try:
with zipfile.ZipFile(zip_file_created_a,'r') as zf:
zf.extractall(pwd=password)
data = zf.namelist()[0]
data_size = zf.getinfo(data).file_size
print('''******************************\n[+] Password found! ~ %s\n ~%s\n ~%s\n******************************'''
% (password.decode('utf8'), data, data_size))
break
except:
number = count
print('[%s] [-] Password failed! - %s' % (number,password.decode('utf8')))
count += 1
pass
答案 0 :(得分:1)
我不确定我是否完全理解该请求,但是您可以做的一件事(如另一篇评论所述)是使用生成器。首先,您不需要生成密码文件,可以在生成每个密码时对其进行测试。为此,您可以从发电机中产生收益。调整您的代码,我们有:
1 import itertools
2
3 def password_generator(min_length=1, max_length=6, chars='123456789'):
4 for i in range(min_length, max_length):
5 for password in itertools.product(chars, repeat=i):
6 yield ''.join(password)
7
8 # Showing a sample of passowrds.
9 for _, password in zip(range(100), password_generator()):
10 print(password)
11
12 is_successful_extraction = False
13
14 for password in password_generator():
15 try:
16 with zipfile.ZipFile(zip_file_created_a,'r') as zf:
17 zf.extractall(pwd=password)
18 data = zf.namelist()[0]
19 data_size = zf.getinfo(data).file_size
20 print('[+] Extracted - password: {}'.format(password))
21 is_successful_extraction = True
22 break
23 except RuntimeError:
24 print('[-] Failure to extract - password: {}'.format(password))
25
26 if is_successful_extraction:
27 print('[+] Successful extraction')
28 else:
29 print('[!] No extraction complete')
这很有帮助,原因有很多。首先,生成器具有参数,因此您可以调整生成密码的长度。接下来,您不必将所有密码都存储在内存或磁盘中。应该快一点。请注意,readlines
将文件的内容存储在RAM中。最后,您只需要遍历一次密码-即在生成密码时。
有关生成器的更多信息,请参阅此link。