一、引言
有的时候,我们需要把zip压缩包解压缩。对于不带密码的,操作比较简单,用zipfile库或pyzipper库打开zip文件,extractall就行。对于带密码的zip包,只要知道正确的密码就好办,extractall的时候提供一个pwd参数就行了。此前本号曾经写过解压缩zip文件的一些文章,感兴趣的同学和读者朋友可以参考。今天本号讨论的是:如果是忘了zip压缩包的密码怎么办呢?如果密码不太长的话,我们可以写个Python程序用枚举法把密码找出来。环境:64位Win 10中文版 + 64位Python 3.7.6
《Python程序设计(基于计算思维和新文科建设)》,ISBN:9787121435577,胡凤国,电子工业出版社,2022年6月。本书是电子工业出版社在国内较早采用纸质版+电子版的创新图书发行模式的第一次尝试。本书是这套创新图书的纸质版部分,与之内容互补的电子版图书将稍后出版。基础篇介绍Python程序设计的入门知识,共12章,包括:⑵ Python软件的安装和Python程序运行;⑶ Python的基本概念(对象、数据类型、表达式、内置函数);排错篇总结初学者常遇到的错误并介绍程序调试方法,包含2章:与本书内容互补的电子版图书包含文本篇和应用篇两部分:文本篇:介绍字符集、编码和文本文件读写的知识,包含了对国家规范《通用规范汉字表》8105个汉字当中难以输入和难以显示的汉字的处理。应用篇:介绍Word、Excel、PPT、PDF、图片等常用办公文件的处理,是大家提高办公和科研效率的好帮手。本书配套有详细的PPT和教学大纲,还有全部例题的程序代码和绝大部分思考题的程序代码。本书配套PPT里面还加入了配套电子版图书中的部分内容,比如字符集和编码,不同编码的文本文件的读写,Word、Excel、PPT、PDF等一些常用办公文件的读写。1、大学文科生, 可选本书当Python教材或自学Python的参考书。2、大学理工科学生, 可选本书当自学Python的参考书。可拿本书当工具书,本书的配套程序会为您节省效率,在当前大数据和新文科的背景下,本书可以为相关领域的量化研究提供技术支持。本书配套的电子版图书中的编码和文本处理知识也可以作为理工科教师和科研人员处理文本数据的参考资料之一,毕竟专门开辟章节介绍国家标准《通用规范汉字表》汉字处理的程序设计图书并不多见。
本书有专门的海龟画图章节,有大量的有趣数学题目,可以培养学生的计算思维,适合对编程感兴趣的中小学生阅读,也适合打算让娃参加编程辅导班的家长朋友参考。本书在各大实体书店和网店均有销售。京东、天猫、当当的购买渠道如下(可扫码直达购买页面)。
三、程序
因为知道密码,我们写个Python程序解压缩的话,很简单:

上面的程序使用了扩展库pyzipper,需要用pip命令安装一下。为什么不用标准库zipfile呢?具体原因在文章如果我们忘了密码的话,解压缩该文件就会出错,提供错误的密码解压缩时也会出错。这个时候,可以考虑用枚举法碰碰运气。
假设密码中的字符全部都是小写字母,且不超过5位。我们写个如下的程序就可以找到正确的密码abcde。


我们发现,经过很多轮的枚举之后,程序终于找到了abcde这个正确的解压密码。四、讨论
上面的代码仅仅是理论上可行。因为它假设密码在5位以内,且密码中仅包含小写字母,这太简单了,实际情况肯定比这复杂。如果位数多的话,可以修改第10行代码,把 range(1, 6) 改成 range(m, n),其中m是密码的最少位数,n位密码的最多位数。如果密码中包含的字符不止小写字母,我们可以修改第8行,为变量pwdchars赋一个新值。进行上述改动之后,程序依然能用,但运行的时间可能大大增加。就目前的简单情况来简单分析一下:sum(26**i for i in range(1, 6))=12356630
个。因为找到密码就退出程序,按所有密码等可能计算,程序每次运行要枚举的平均密码个数是原来的一半,是6178315个。其实,1到4位的密码总数相对于5位的密码总数来说是微不足道的,为简单起见,我们只考虑5位的密码。这样:
对于 5 位的密码,程序平均需要枚举 26**5//2 次;
对于 6 位的密码,程序平均需要枚举 26**6//2 次;
对于 n 位的密码,程序平均需要枚举 26**n//2 次。
当 n = 10 的时候,需要枚举的数字是 70583547826688,假设计算机每秒钟枚举1亿个密码,那么,找出这个10位密码所需要的时间就是70583547826688/10**8/3600 ≈ 196上面的讨论还只是假设密码字符仅包含小写字母,如果考虑大写字母、数字、特殊符号,程序找出10位密码所需要的时间将是一个天文数字。
所以,划个重点:我们设置密码的时候,一定要把密码设置得长长的,而且尽量要覆盖多种字符类型,这样的话,别人想破解我们的密码也不可能。如果简单的用6位数字或者8位数字试试,别人分分钟就把我们的的密码给破解了。
由于本号文章以辅助教学为主,笔者不建议自己的学生直接拿代码运行,而是建议在理解了思路之后自己敲代码来加深印象,所以本号一般不直接贴代码。如果其他读者朋友有需要代码,请关注本号,加笔者微信联系。欢迎关注微信公众号“语和言”,本公众号将不定期发布对图书《Python程序设计(基于计算思维和新文科建设)》中的Python知识点进行解读和补充的内容。语和言公众号还有读者交流群,读者朋友可以入群一起讨论问题。
欢迎跟图书《Python程序设计(基于计算思维和新文科建设)》的作者胡凤国老师进行交流,电邮:cuchufengguo@163.com。
六、图书目录
图书《Python程序设计(基于计算思维和新文科建设)》目录如下(手机端可以用手指上下滑动下面灰色区域的文字来查看全部目录,电脑端可以用鼠标滚动滚轮或拖动下面文本框右边的滚动条来浏览全部目录):
8.2.4 关于元素可比较的有序序列类对象的通用操作10.3.3 用上下文管理语句with来管理文本文件读写12.12.1 datetime标准库定义的常用类参考文献