python 破解加密zip文件的密码


Posted in Python onApril 22, 2021

今天的文章来自 盏茶作酒 同学。他在老电脑中发现了一个加密的 zip 文件,于是用 Python 破解了文件密码。在破解的过程中出现了内存爆炸的问题,通过阅读 Python 源代码找到了解决方案。

下面就来给大家分享一下他的操作。

之前在家里的老电脑中,发现一个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,网上下载了很多破解密码的软件都没有效果,于是想到自己用Python写一个暴力破解密码的脚本。
Python 有一个内置模块 zipfile 可以解压 zip 压缩包。先来测试一波:创建一个测试文件,压缩,设置解压密码为123。

python 破解加密zip文件的密码

import zipfile

# 创建文件句柄
file = zipfile.ZipFile("测试.zip", 'r')
# 提取压缩文件中的内容,注意密码必须是bytes格式,path表示提取到哪
file.extractall(path='.', pwd='123'.encode('utf-8'))

运行效果如下图所示,提取成功。

python 破解加密zip文件的密码

既然如此,那我不停尝试所有可能的密码组合去解压缩不就行了嘛~

好了,开始破解老文件的密码。

为了提高速度,我还加了多线程的代码:

import zipfile
import itertools
from concurrent.futures import ThreadPoolExecutor

def extract(file, password):
    if not flag: return
    file.extractall(path='.', pwd=''.join(password).encode('utf-8'))


def result(f):
    exception = f.exception()
    if not exception:
        # 如果获取不到异常说明破解成功
        print('密码为:', f.pwd)
        global flag
        flag = False


if __name__ == '__main__':
    # 创建一个标志用于判断密码是否破解成功
    flag = True
    # 创建一个线程池
    pool = ThreadPoolExecutor(100)
    nums = [str(i) for i in range(10)]
    chrs = [chr(i) for i in range(65, 91)]
    # 生成数字+字母的6位数密码
    password_lst = itertools.permutations(nums + chrs, 6)
    # 创建文件句柄
    zfile = zipfile.ZipFile("加密文件.zip", 'r')
    for pwd in password_lst:
        if not flag: break
        f = pool.submit(extract, zfile, pwd)
        f.pwd = pwd
        f.pool = pool
        f.add_done_callback(result)

然而,事情并没有那简单……

代码跑一会儿,内存爆了!

python 破解加密zip文件的密码

于是,为了找寻问题所在,我就去查看了一下源码,发现ThreadPoolExecutor默认使用的是无界队列。而程序中尝试密码的速度跟不上生产密码的速度,就会把生产任务无限添加到队列中。导致内存被占满。内存直接飙到95:

python 破解加密zip文件的密码

找到病根儿,剩下的就是对症下药了。

继承并重写了ThreadPoolExecutor类中的_work_queue属性,将无界队列改成有界队列,这样就不会出现内存爆满的问题,看代码:

import queue
from concurrent.futures import ThreadPoolExecutor


class BoundedThreadPoolExecutor(ThreadPoolExecutor):
    def __init__(self, max_workers=None, thread_name_prefix=''):
        super().__init__(max_workers, thread_name_prefix)
        self._work_queue = queue.Queue(self._max_workers * 2) # 设置队列大小

用自定义的BoundedThreadPoolExecutor类替代前面代码中的ThreadPoolExecutor。

再次执行……

python 破解加密zip文件的密码

程序输入如下图内容:

python 破解加密zip文件的密码

Bingo!破解成功!(原来密码如此简单……)
话说回来,毕竟这个压缩包我是隐约知道它的位数和范围(字母和数字),所以破解出来需要的时间是可以忍受的。如果有天你在网上找了一个无人认领的加密压缩包,想要一窥究竟但又并不知道它有多少位密码,那我只能祝你好运啦~

以上就是python 破解加密zip文件的密码的详细内容,更多关于python 破解zip文件密码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 Python
Python 中 Virtualenv 和 pip 的简单用法详解
Aug 18 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
Python编程求质数实例代码
Jan 31 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
Jan 18 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
python matplotlib imshow热图坐标替换/映射实例
Mar 14 Python
numpy库reshape用法详解
Apr 19 Python
python入门之算法学习
Apr 22 #Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 #Python
python 实现德洛内三角剖分的操作
python 三边测量定位的实现代码
python如何读取.mtx文件
Apr 22 #Python
Python中tkinter的用户登录管理的实现
python爬虫之利用selenium模块自动登录CSDN
You might like
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
浅析php原型模式
2014/11/25 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
js Calender控件使用详解
2015/01/05 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JS常用算法实现代码
2016/11/14 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
小程序实现留言板
2018/11/02 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
python赋值操作方法分享
2013/03/23 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
部队万能检讨书
2014/02/20 职场文书
小学三八妇女节活动方案
2014/03/16 职场文书
租赁意向书范本
2014/04/01 职场文书
小小商店教学反思
2014/04/27 职场文书
安全生产先进个人总结
2015/02/15 职场文书