借用Python迭代器itertools暴力破解压缩文件密码 | 您所在的位置:网站首页 › 消费者权益保护法教案成人 › 借用Python迭代器itertools暴力破解压缩文件密码 |
〇、开篇 人是健忘的。很多琐事,忘就忘了,没什么大不了。 但,有些琐事,却忘不得。 像是媳妇生日、私房钱藏匿点、文件解压密码什么的。 好在媳妇可以哄、私房钱数额小。不过多哄哄、多找找的事。 那解压密码怎么办呢?正所谓:硬盘有价,数据无价。 别着急,套路差不多。和哄媳妇一个理。 重复穷举、法力无边。 就以Python自带的zipfile、itertools标准库为例,为朋友们演示吧。 一、itertools.product()利用Python标准库itertools的product函数,就能穷举指定字符串的排列组合了。 https://docs.python.org/zh-cn/3/library/itertools.html 1、product()itertools.product方法可以返回一个笛卡尔积元组,只要把元组拼接成字符串,就能穷举出所有字符串元素的排列组合。 假设,字符长度为2,构成字符的元素为‘ABCD’,product就会穷举由‘ABCD’构成的所有2位字符。 示例: In [1]: from itertools import product In [2]: keys = product('ABCD', repeat=2) In [3]: for key in keys: ...: key_str = ''.join(key) ...: print(key_str) ...: AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD In [4]:实验结论: 把构成密码的字符串元素,进行排列穷举。就能命中正确密码。 二、zipfilePython在其标准库中提供了处理zip文件的zipfile。利用zipfile库的extract函数,就能解压文件。 在解压文件的过程中,传入 itertools.product() 穷举的密码,就可以达到暴力破解的效果了(破解时间和密码的复杂程度正相关) 这里不再赘述zipfile的基本用法。不熟悉zipfile用法的朋友,可以移步至Python官网参考相关Documents, 当然,rar和7z文件,Python也有第三方模块支持,相关方法,大同小异。 三、密码破解实验操作系统: MacOS 10.15.7 实验路径:~/Coding/Python/CompressPy 压缩文件:test.zip 解压密码:huawei 压缩文件包含内容:hello.txt Hello Python1、准备压缩文件进入相关目录 cd ~/Coding/Python/CompressPy建立文本文件 vim hello.txt i Hello Python :x压缩并加密 zip -r -P huawei test.zip hello.txt操作演示: Python破解zip解压密码示例 import zipfile import itertools # 打开压缩文件 zip_file = zipfile.ZipFile('./test.zip') # 把压缩文件内,所含的单个文件放入列表 zip_list = zip_file.namelist() # 有可能构成密码字符(穷举字典) chars_dict = 'aehiuw' # 这里repeat理解成密码长度为6位,当然可以用循环定制密码长度范围,这里简单处理 passwords = itertools.product(chars_dict, repeat=6) # 用一个列表,来装itertools穷举出的密码字符串 list_password = list() # 把itertools.product方法穷举的密码,类型转换成字符串,放入密码列表 for password in passwords: password = ''.join(password) list_password.append(password) # 把文件列表中的文件取出来,尝试用密码列表中的密码解密 for f in zip_list: # 从密码列表中循环去除密码测试解密 for key in list_password: # 成功解密后,把正确的解压密码打印出来,并结束循环 try: zip_file.extract(f, pwd=key.encode('utf-8')) print(f'you password is : {key}') break # 如果密码错误,打印报错信息 except Exception as Error: print(Error)破解效果展示: 第三节的Python代码,有很大的优化空间。 比如: 可以用擅长cpu-base的多进程来加快破解速度。 可以用循环来控制密码的长度范围。 for times in range (6, 17): itertools.product(keys, repeat = times)这里就不再赘述了。 |
CopyRight 2018-2019 实验室设备网 版权所有 |