请确保有以下第三方库包:rarfile,zipfile
如未安装:
- pycharm可通过setting-project-python interpreter 添加
- 或使用命令
pip install zipfile
,pip install rarfile
安装
代码奉上:
class RarPassword():
def __init__(self, filename, target_path):
"""
:param filename: 待破解的压缩包
:param target_path: 解压路径
"""
self.target_path = target_path
# 根据文件扩展名,使用不同的库
if filename.endswith('.zip'):
import zipfile
self.fp = zipfile.ZipFile(filename)
elif filename.endswith('.rar'):
import rarfile
self.fp = rarfile.RarFile(filename)
else:
raise Exception("只支持zip和rar解压")
def brutal_extract(self, lengths=[4, ], lower=False, upper=False, digit=False, punctuation=False):
"""
# 遍历所有可能的密码,暴力破解
:param lengths: 密码长度,可以指定所有需要考虑的长度,如[4, 5, 6]等
:param lower: 是否考虑小写字母
:param upper: 是否考虑大写字母
:param digit: 是否考虑数字
:param punctuation: 是否考虑标点符号
:return:
"""
import string # 用于生成密码本
# from itertools import combinations # 用于生成所有可能的密码
import itertools # 用于生成所有可能的密码
passward_dict = ""
if lower:
passward_dict += string.ascii_lowercase
if upper:
passward_dict += string.ascii_uppercase
if digit:
passward_dict += string.digits
if punctuation:
passward_dict += string.punctuation
print("密码本:\t{}\n密码长度:\t{}\n".format(passward_dict, lengths))
count = 0
for length in lengths:
# combinations(passward_dict, length) 实现排列组合,密码字符不会重复,即遍历不到12132这类有重复字符的密码
# 这里在原博主基础上做了改进,使用itertools.product()方法,使用自身的笛卡尔积的方式
for passward in itertools.product(passward_dict, repeat=length):
passward = "".join(passward)
count += 1
print(passward, end=" ")
if self.extract(passward):
print()
print("一共尝试了{}种可能".format(count))
return
print("对不起,暂未找到,请尝试:\n1. 其他密码长度\n2. 包含更多种类的密码字符")
# 尝试解压
def extract(self, passward):
try:
self.fp.extractall(path=self.tatget_path, pwd=passward.encode())
print()
print('成功破解该压缩包,密码为: ' + passward)
self.fp.close()
return True
except:
pass
def main():
# 类似如下的绝对路径或者相对路径均可
filepath = "C:/Users/Administrator/Desktop/abc.rar"
targetpath = "C:/Users/Administrator/Desktop/"
x = RarPassword(filename=filepath,target_path=targetpath)
# 4,5,6,7,8,9,10,11,12,13,14,15表示你认为的密码的长度可能位数
x.brutal_extract([4,5,6,7,8,9,10,11,12,13,14,15], digit=True, lower=True, upper=True, punctuation=True)
if __name__ == '__main__':
main()