python实现遍历破解压缩包密码zip,rar

原博主:视频详解和其他破解方法

请确保有以下第三方库包: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()

你可能感兴趣的:(工作技能UP)