如下,ls让我们用python破解zip文件的密码。其中的key是我得出来的穷举密码的列表,python.zip是要解压缩的文件。我想问的是,如何判断文件是否解压成功,从而停止并且显示密码。破解可以成功,但是文件名是乱码,并且一个文件为空,也无法显示密码。(忽略我key的得出过程,比较低级)
import zipfile
import itertools
key = []
result_1 = []
result_2 = []
password1 = [chr(e1) for e1 in range(48,58)]
password2 = [chr(e2) for e2 in range(97,123)]
for r1 in range(0,len(password1)-2):
result1 = password1[0+r1]+password1[1+r1]+password1[2+r1]
result_1.append(result1)
for r2 in range(0,len(password2)-2):
result2 = password2[0 + r2] + password2[1 + r2] + password2[2 + r2]
result_2.append(result2)
ret = [''.join(item) for item in itertools.product('0123456789',repeat=6)]
for d1 in result_1:
for d2 in result_2:
re1 = d1+d2
re2 = d2+d1
key.append(re1 and re2)
key += ret
f = zipfile.ZipFile('python.zip')
for password in key:
f.extractall(pwd=password.encode(encoding='utf-8'))
不知道你这个问题是否已经解决, 如果还没有解决的话:有两个字典列表
list1 = [{"terminal_code": '1', "terminal_id": "00001"},
{"terminal_code": '3', "terminal_id": "00003"},
{"terminal_code": '2', "terminal_id": "00002"}]
list2 = [{"terminal_id": "00003", "terminal_name": "终端3"},
{"terminal_id": "00002", "terminal_name": "终端2"},
{"terminal_id": "00001", "terminal_name": "终端1"}]
现在希望将list2根据list1中terminal_id的顺序进行排序,期望值如下:
list2 = [{"terminal_id": "00001", "terminal_name": "终端1"},
{"terminal_id": "00003", "terminal_name": "终端3"},
{"terminal_id": "00002", "terminal_name": "终端2"}]
实现代码如下:
c = [i['terminal_id'] for i in list1]
def a(elem):
return c.index(elem['terminal_id'])
list2.sort(key=a)
print(list2)
# [{"terminal_id": "00001", "terminal_name": "终端1"},
# {"terminal_id": "00003", "terminal_name": "终端3"},
# {"terminal_id": "00002", "terminal_name": "终端2"}]
一句代码实现
list2.sort(key=lambda x: [i['terminal_id'] for i in list1].index(x['terminal_id']))
对于判断是否成功解压文件,可以在解压后获取zip文件中的文件列表,并检查文件列表的长度是否与预期相同。对于显示解压密码,可以在try语句块内加入一条print语句来显示尝试的密码。修改后的代码如下:
import zipfile
key = ["password1","password2","password3"]
zip_file = zipfile.ZipFile('python.zip')
for password in key:
try:
zip_file.extractall(pwd=bytes(password,'utf-8'))
print("Password found: ", password)
file_list = zip_file.namelist()
if len(file_list) == 2: # 假设压缩包中有两个文件
print("File extracted successfully.")
else:
print("Something went wrong while extracting file.")
break
except Exception as e:
print("Trying password: ", password)
print("Error:", e)
需要注意的是,虽然压缩包中只有一个文件,但解压后可能会伴随着其他文件或文件夹的生成,因此对文件列表长度的判断需要谨慎。另外,如果出现异常需要打印异常信息以便于排查问题。