published on in Python

密码篇・密码猜解

返回教程主页

上篇 密码篇・实际应用

几乎所有成熟的商用密码都能经受严格的密码破解分析,一般来说想要对一个加密的数据进行破译最简单的方法就是直接猜测密钥,如果条件允许甚至可以进行大量尝试。为了提高破译效率可以先准备好大量的可能性较高的密钥,然后依次遍历猜测密钥,这种做法有个名词叫“字典爆破”。

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语句接收。

下篇 密码篇・并行密码猜解