利用 Python 破解 ZIP 或 RAR 文件密码
Python 破解压缩包密码
我们经常从网络上下载带有密码的压缩包,如果想要获取其中的内容,通常需要支付费用给提供商。然而,有一种常见的方法是使用百度搜索压缩包密码破解软件,但是使用这种方法的后果是不堪设想的。本文将介绍如何使用 Python 来破解 ZIP/RAR 压缩包的密码。
破解原理
其实破解密码的原理非常简单,可以用一句话概括为「大力出奇迹」。Python 提供了两个压缩文件库:zipfile
和 rarfile
,这两个库提供了解压缩方法 extractall()
,可以指定密码进行解压缩。因此,我们首先需要生成一个密码字典(可以手动创建或使用程序生成),然后逐个尝试其中的密码,如果能够成功解压缩,就表示密码正确。
实验环境
本文使用 Pipenv 创建虚拟环境,关于 Pipenv 的详细介绍可以参考我的文章《Python 管理哪家强?》。需要安装的库有:
zipfile
:Python 标准库,无需额外安装rarfile
:Python 第三方库,需要使用pipenv install rarfile
安装
最后,将一个带有密码的压缩包放入实验环境中。
编码
了解了原理之后,编写代码就变得非常简单了。
准备密码本
密码本其实就是一个包含了所有可能密码的文件,可以手动录入,也可以使用程序生成。文末还会有一个介绍。
读取压缩文件
根据文件扩展名,使用不同的库进行处理。
if filename.endswith('.zip'):
fp = zipfile.ZipFile(filename)
elif filename.endswith('.rar'):
fp = rarfile.RarFile(filename)
尝试解压缩
首先尝试不使用密码进行解压缩,如果成功则表示压缩文件没有密码。
fp.extractall(desPath)
fp.close()
print('No password')
暴力破解
try:
# 读取密码本文件
fpPwd = open('pwd.txt')
except:
print('No dict file pwd.txt in current directory.')
return
for pwd in fpPwd:
pwd = pwd.rstrip()
try:
fp.extractall(path=desPath, pwd=pwd.encode())
print('Success! ====> ' + pwd)
fp.close()
break
except:
pass
fpPwd.close()
程序入口
if __name__ == '__main__':
filename = sys.argv[1]
if os.path.isfile(filename) and filename.endswith(('.zip', '.rar')):
decryptRarZipFile(filename)
else:
print('Must be Rar or Zip file')
使用
如果想要使用上述代码,只需在命令行执行 python main.py
,并指定要解密的压缩包文件。例如:python main.py test.zip
。
运行结果:
$ python main.py test.zip
Success! ====> 323126
扩展
密码本如何获取?
注意到这里,细心的读者可能会发现,最关键的不是代码,而是「密码本」。理论上,只要密码本中的密码足够多,就一定能够获取到压缩包的密码,这也被称为「撞库」。
在搜集足够多的密码时,已经有人整理好了一份密码本,我在我的仓库中 fork 了一份,有兴趣的可以点击爆破字典。
如何加速破解过程?
解决了密码本的问题后,深入思考的读者可能会有新的疑问,即如何加速破解过程。下面给出两个思路:
多线程(进程)破解:当密码本非常庞大且密码数量众多时,可以采用多线程(进程)的方式读取密码。一个进程读取一个密码本,一个线程分段读取密码。然而,在 Python 中不建议使用多线程,因为 Python 中的线程并不是真正的并行执行,有兴趣的读者可以阅读相关资料了解更多。
利用 GPU 加速:以上的代码都是在 CPU 上运行的,即使开启多线程(进程),也只是利用到了 CPU 的资源。然而,为了加速破解过程,我们可以利用闲置的 GPU 资源。CPU 虽然有多核,但总数有限,每个核的运算能力非常强大。而 GPU 的核数远超 CPU,但每个核的运算能力相对较弱。因此,在破解密码的过程中,完全可以利用 GPU 来加速。实际上,已经有一些工具可以实现这一点,其中最著名的就是 Hashcat,它被称为世界上最快的密码恢复工具,可以基于 CPU/GPU 进行工作。有兴趣的读者可以访问 Hashcat 的官网了解更多信息。
以上是关于使用 Python 破解压缩包密码的内容。希望对您有所帮助!