python破解压缩包密码(密码字典)

系列文章目录

前言

一、设置压缩包密码

1、打开压缩软件,新建压缩文件,这里使用Bandizip; 2、点击添加或将文件拖进来,点击设置密码-输入密码-开始压缩;

二、python解除压缩密码(1)

问题描述:当我们忘记我们的压缩密码时;

1.源码

zipcrack.py代码如下(示例):

# -*- encoding = utf-8 -*- 
import zipfile
import optparse


def extractFile(zFile,password):
    """
    解压函数
    """
    try:
        zFile.extractall(pwd=password.encode(utf-8))
        print([+] Password =  + password + 
)
        return True
    except:
        return 
def main():

    parser = optparse.OptionParser("usage:" + "-f <zipfile> -d <dictionary>")
    parser.add_option(-f, dest=zname, type=string, help=specify zip file)
    parser.add_option(-d, dest=dname, type=string, help=Password dictionary)

    (options, args) = parser.parse_args()

    if(options.zname == None) | (options.dname == None):
        print(parser.usage)
        exit(0)
    else:
        zname = options.zname
        dname = options.dname
    zFile = zipfile.ZipFile(zname)
    try:
        passFile = open(dname, r, )
        with open(dname, r, encoding = utf-8) as passFile:
            for line in passFile.readlines():
                password = line.strip(
)
                flag = extractFile(zFile, password)
                if flag:
                    print(爆破成功)
                    break
    except Exception:
        print(错误输入)
        
if __name__ == __main__:
    main()

2.使用方法

运行命令如下:

python zipcrack.py -f  file.zip -d password.txt

password.tex为密码字典(可替换);

三、python解除压缩密码(2)

1.源码

import time
from typing import List
from tqdm import tqdm
from itertools import chain
from zipfile import ZipFile

start = time.time()

# chr(97) -> a 这个变量保存了密码包含的字符集

dictionaries = [chr(i) for i in
                chain(range(97, 123),    # a - z
                      range(65, 91),    # A - Z
                      range(48, 58))]    # 0 - 9

#dictionaries.extend([.com, www.])    # 添加自定义的字符集


#dictionaries = [chr(i) for i in range(48, 58)]    # 0 - 9
file_name = "hello.zip"# 你的文件路径

def all_passwd(dictionaries: List[str], maxlen: int):
    # 返回由 dictionaries 中字符组成的所有长度为 maxlen 的字符串

    def helper(temp: list, start: int, n: int):
        # 辅助函数,是个生成器
        if start == n:    # 达到递归出口
            yield .join(temp)
            return
        for t in dictionaries:
            temp[start] = t    # 在每个位置
            yield from helper(temp, start + 1, n)

    yield from helper([0] * maxlen, 0, maxlen)

zfile = ZipFile(file_name, r)    # 很像open

def extract(zfile: ZipFile, pwd: str) -> bool:
    # zfile: 一个ZipFile类, pwd: 密码
    try:
        zfile.extractall(path=., pwd=pwd.encode(utf-8))    # 密码输入错误的时候会报错
        now = time.time()                                      # 故使用 try - except 语句
        print(f"Password is: {pwd}")                           # 将正确的密码输出到控制台
        return True
    except:
        return False    
# 用 bool 类型的返回值告诉主程序是否破解成功 (意思就是返回 True 了以后就停止)

#lengths = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]    # 密码长度
lengths = [4]    # 密码长度
total = sum(len(dictionaries) ** k for k in lengths)    # 密码总数


for pwd in tqdm(chain.from_iterable(all_passwd(dictionaries, maxlen) for maxlen in lengths), total=total):
    if extract(zfile, pwd):    # 记得extract函数返回的是bool类型的哦
        break

2.使用方法

pip3 install tqdm==4.50.2

安装好后,运行破解脚本即可!


总结

分享: 想像力比知识更重要。因为知识是有限的,而想像力是无限,它包含了一切,推动着进步,是人类进化的源泉。——爱因斯坦

经验分享 程序员 微信小程序 职场和发展