几乎所有成熟的商用密码都能经受严格的密码破解分析,一般来说想要对一个加密的数据进行破译最简单的方法就是直接猜测密钥,如果条件允许甚至可以进行大量尝试。为了提高破译效率可以先准备好大量的可能性较高的密钥,然后依次遍历猜测密钥,这种做法有个名词叫“字典爆破”。
ZIP压缩文件读写
ZIP压缩包是被广泛使用的具备加密功能的文件类型,我们可以从爆破ZIP压缩文件入手学习如何使用Python进行“字典爆破”,不过在这之前我们得掌握ZIP压缩文件的读写操作:
import zipfile
with zipfile.ZipFile('myzipfile.zip', 'w') as zf:
zf.write('message.txt')
引入zipfile
模块,将当前目录下的message.txt
文件写入到 myzipfile.zip
压缩包中。
import zipfile
with zipfile.ZipFile('myzipfile.zip') as zf:
print(zf.read('message.txt').decode())
从myzipfile.zip
压缩包中读入message.txt
文件并打印输出。
import zipfile
with zipfile.ZipFile('myzipfile.zip') as zf:
zf.extractall()
解压myzipfile.zip
中所有的文件。
遍历字典猜解密码
首先我们准备一份密码字典:
jojo
kk
python
password
admin
somebody
gogogo
bxtkezhan
然后我们随便选择其中一个密码用来制作加密的ZIP压缩包,我这边使用admin
,然后运行如下Python代码进行密码猜解:
import zipfile
with open('password.dict') as f:
passwords = f.read().splitlines()
with zipfile.ZipFile('myzipfile.zip') as zf:
for password in passwords:
try:
zf.extractall(pwd=password.encode())
except RuntimeError:
continue
print('password is', password)
break
运行结果:
password is admin
使用zf.extractall
方法逐一测试密码字典password.dict
中的密码,如果当前密码测试失败就进入下一轮,如果成功则打印密码并结束循环。
Note! zf.extractall
方法可以通过参数pwd
指定密码;如果密码错误则会抛出RuntimeError
错误,可以使用try except
语句接收。