我遇到了一个使用python来解决的问题:
我们已经开始整理文件以尝试理解它们,但是它们都被数字三位数的密码锁定。
看看是否可以编写脚本以进入示例文件
alien-zip-2092.zip
并读取文本文件,我们认为其中的文件名为zip(因此为alien-zip-2092.txt
)。文件应提取到
/tmp/
目录中。
到目前为止,我的代码中只有这样。它获取了zip文件,并使用0-999中的所有数字将其提取出来,但是每次运行代码时,我最终只会得到999
。无法检查文件夹是否已正确提取,因此我添加了Print (password)
进行检查。
这是我的代码:
import zipfile
zf = zipfile.ZipFile("/tmp/alien-zip-2092.zip")
for password in range(0,1000):
try:
zf.extract(member="/tmp", pwd = str(i).encode()
password = 'Password found: %s' % password
except:
pass
print(password)
似乎我的程序正在用一个具有相同名称的空白文件覆盖正确的文件,因为它在提取文件后没有中断循环,但我可能是错的。
打印出应该位于压缩文件夹中的txt文件的内容将是一个好主意,但是如果没有其余代码,就无法做到这一点。
为什么打印的密码不正确?还有其他想法可以解决主要问题吗?
答案 0 :(得分:1)
您要为存储“找到密码”消息的变量命名,与for
循环的迭代变量相同,因此,一旦下一次迭代开始,它将覆盖已存储的消息。 / p>
您应该改为打印正确的密码,并在找到后立即break
循环,并对else
循环使用for
块来处理没有正确密码的情况找到,如果循环在没有break
的情况下结束,则会发生这种情况:
import zipfile
zf = zipfile.ZipFile("/tmp/alien-zip-2092.zip")
for password in range(0,1000):
try:
zf.extract(member="/tmp", pwd = str(i).encode())
print('Password found: %s' % password)
break
except:
pass
else:
print('No valid password found.')
答案 1 :(得分:1)
一些建议:
password
,它是您的循环变量。另外,i
似乎没有定义,因此您可能想要更改它。'{:03d}'.format()
).extractall()
或至少在member
中指定正确的path
和.extract()
。这是代码的修改版本:
import zipfile
filename = 'alien-zip-2092'
zf = zipfile.ZipFile('{}.zip'.format(filename))
password = None
for i in range(1000):
try:
temp_password = '{:03d}'.format(i)
zf.extract(
member='{}.txt'.format(filename),
path='/tmp/',
pwd=temp_password.encode())
# extraction was successful
password = temp_password
break # exit the for loop
except zipfile.BadZipFile as err:
# print(err)
pass
if password is None:
print('No valid password found.')
else:
print('Password found: {}'.format(password))