老爸说他有个照片文件夹打不开了,让我过去看看,一瞅,好家伙,加密压缩包尘封老照片呀。

既然加密,没准还有意外收货。

打开网易新闻 查看更多图片

寻找思路

解密压缩包的思路是什么?

答:通过各种密码去尝试解压文件。

用什么解压文件?

答:zip 使用 zipfile,rar 使用 rarfile,已经有 Python 大佬给我们写好啦,只需要调用它们的方法即可。

密码从哪里找?

答:程序自行运算或者找密码本。

思路整理清楚之后,就可以开始了。

zipfile 与 rarfile

zipfile:Python 内置,无需安装;

rarfile:需要安装一下,文档参照:https://rarfile.readthedocs.io/api.html。

解压文件使用二者生成对象的 extractall 方法即可。

以下内容以 zipfile 库进行举例,举一反三即可。

先默默通过 zipfile 解压一个没有密码的文件,试试手感。

测试文件自己进行打包压缩即可,先尝试英文或者数字文件命名,在尝试中文命名。

完成任务,成功解压文件,

zip

文件和 python 代码放置在同一目录。

解压带密码的文件

下面假装不知道密码,通过密码进行解压,设置密码为

1234

打开网易新闻 查看更多图片

成功解压,后文就可以通过这种思路,对压缩包进行解压。

中文乱码问题

在测试的时候,还发现了如果文件名是中文,解压之后文件名出现乱码情况,修正它。

找到 Python 安装中的 Lib 文件夹,然后打开 zipfile.py 文件,直接修改源码。

搜索 fname_str = fname.decode("cp437"),再后面添加如下内容。

搜索

filename = filename.decode('cp437')

,再后面追加如下代码。

保存该文件,再对测试文件进行解压,解压成功,文件名无错误。

解密文件

进入正式环节,接下来就要解密老爸的压缩包了,这么有价值的压缩包,可别打不开。

假设老爸的密码是 4 位,可以直接编写如下代码进行测试。

提前准备测试压缩包,密码为了好破解设置为

aaaf

,代码如下:

非常简单的运行几秒之后,文件解压成功。

此时相信大佬们已经发现问题,如果密码不是 4 位,是不确定的位数,那我那一处细致入微的循环操作,就要修改了。

而且我不知道老爸的密码是多少位数的,这就有点难度了。

更加优秀的解法

在 Python 中已经内置好了一个迭代器,可用于从一个字符串中固定的取出指定位数的密码,测试代码如下:

打开网易新闻 查看更多图片

上述代码用到了

itertools.permutations

,该函数的用法如下:

连续返回由

iterable

元素生成长度为

r

的排列。

如果

r

未指定或为

None

r

默认设置为

iterable

的长度,这种情况下,生成所有排列。

所以使用上述代码,可以快速的生成指定位数的密码,后续只需要传入老爸密码的位数,即可不变动代码就进行程序测试了。

经过改良之后,你可以动态控制密码的长度了,如果需要特殊符号也可以继续扩充 my_password_str 字符串。

扩展思路

密码的获取一定要自己生成吗?

答:有种文件叫做密码本,所以去找到一些,然后逐行读取就好了。

一个个的解密太慢了,有高效的办法吗?

答:多线程或者多进程破解,一个进程读一个密码本,每个进程下面在启用几个线程去分段解析密码。

事件后续

代码虽然写好了,但文件解密我用多线程轮询了 2 天,还是没有解开(相当真实的体验了)。

由于不知道密码组成和密码位数,也不知道算到何年何月去了,我决定还是从老爸那里在找找突破口,“逼问了”一下常用的密码,尤其是知道其银行卡密码之后,得到重要突破点。

解密结果:最终的最终尝试一周之后,文件解开了,密码不复杂,姓的首字母+123789。

本因为是我的姓名+生日,最后得一波感动,然而我还是多虑啦,哈哈哈。

求点赞、求评论、求收藏。

有任何疑问都可以在评论区询问,有问必答~