)
Python 实现 ZIP 暴力破解(zipfile + argparse 实战,4 台服务器分布式并行)本文面向有一定 Python 基础、想了解文件加密原理与并行计算实战的读者。通过一个完整可运行的例子,带你掌握zipfile与argparse两大标准库,并把破解任务横向扩展到 4 台云服务器,体验「分布式并行」带来的加速效果。0. 法律与道德声明(必读)本文所有代码仅用于合法授权场景下的学习与实践,例如:找回自己忘记密码的压缩包;CTF / 安全攻防演练等授权测试环境。严禁将其用于破解他人隐私、商业机密或任何你无权访问的文件。请遵守《网络安全法》等相关法律法规,后果自负。1. 背景与原理ZIP 是最常见的压缩格式之一。当勾选「加密」时,主流工具默认使用传统 PKWARE(ZipCrypto)加密。其破解思路非常简单:拿到一个候选密码;尝试用它解压 zip 里的某个文件;密码正确 → 解压成功;密码错误 → 解密出的数据是随机噪声,解压/校验会失败。把「候选密码」的来源分成两类:方式候选来源适用场景字典攻击密码词典文件(每行一个)密码可能来自常见弱口令字符集暴力按字符集穷举所有组合已知密码规则(如 4 位数字)本文两种都实现,并支持单机多进程与多机分布式两种执行模式。2. 环境准备Python 3.8+(标准库即可,无需第三方包)一台或多台Linux 服务器(本文实测 4 台,配置均为 8 vCPU / 16GiB)被破解方需为传统加密的 zip(zip -e/zip -P生成),Python 的zipfile才能读取生成测试加密包(任选其一,脚本已自动兼容):# 方式 A:系统 Info-ZIP 命令(绝大多数 Linux 自带)zip-P'Cr@ckM3_2026'-qsecret.zip secret.txt# 方式 B:Python 3.11+ 的 zipfile 写密码参数python3 make_zip.py3. 知识点一:zipfile模块zipfile是 Python 处理 zip 的标准库,本文用到以下关键 API:API作用zipfile.ZipFile(path)打开一个 zip 文件zipfile.is_zipfile(path)判断是否为合法 zipzf.infolist()列出内部成员元信息info.flag_bits 0x1判断该成员是否加密zf.read(name, pwd=b'...')用密码读取(解压)某个成员判断 zip 是否加密是破解前的必要校验:importzipfilewithzipfile.ZipFile("secret.zip")asz:encrypted=any(info.flag_bits0x1forinfoinz.infolist())print("是否加密:",encrypted)核心判定逻辑——尝试用候选密码读取第一个文件:importzlib,zipfiledefcheck_password(zf,pwd):try:first=zf.infolist()[0]zf.read(first.filename,pwd=pwd.encode("utf-8"))returnTrue# 密码正确except(RuntimeError,zlib.error,zipfile.BadZipFile):returnFalse# 密码错误⚠️ 为什么捕获三类异常?传统加密的 zip 在密码错误时,解密出的明文是随机噪声:多数情况 zlib 解压直接失败,抛RuntimeError/zlib.error;极小概率噪声能骗过解压,但在 CRC 校验处抛BadZipFile。三者都代表「密码不对」,统一捕获即可。4. 知识点二:argparse模块argparse用于解析命令行参数,让脚本用起来像专业工具。基本套路:importargparse p=argparse.ArgumentParser(prog="zip_cracker.py",description="ZIP 密码暴力破解工具")p.add_argument("-z","--zip",required=True,help="目标 zip 路径")p.add_argument("-d","--dict",help="字典文件路径")p.add_argument("-t","--threads",type=int,default=4,help="工作进程数")args=p.parse_args()print(args.zip,args.dict,args.threads)常用要点:required=True:必填参数;type=int:自动转成整数;action="store_true":出现即为True(如-v/--verbose);default:默认值(如进程数默认取cpu_count());epilog+RawDescriptionHelpFormatter:在帮助末尾显示多行使用示例。5. 整体实现思路┌─────────────── 候选密码生成器 ───────────────┐ │ 字典模式: 逐行读取 wordlist.txt │ │ 暴力模式: itertools.product(字符集, 长度) │ └─────────────────────────────────────────────┘ │ 按节点编号取模分区 (i % N == node) ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 节点 0 │ │ 节点 1 │ │ 节点 2 │ │ 节点 3 │ ← 4 台服务器 │ 8 进程 │ │ 8 进程 │ │ 8 进程 │ │ 8 进程 │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ 各自用 zipfile 尝试解压,谁先找到谁上报 └───────────────────┬───────────────────┘ 找到密码 FOUND单机:nodes=1,所有候选在一个进程池里跑;分布式:nodes=4,每台服务器只负责i % 4 == node的那 1/4 候选,互不重叠、协同完成。分区技巧:用enumerate给每个候选编号,再按编号 % 节点数 == 本节点编号过滤,保证不重不漏地覆盖整个密钥空间。6. 完整代码zip_cracker.py下面是本文配套脚本的完整实现(标准库,跨平台):#!/usr/bin/env python3# -*- coding: utf-8 -*-"""Python 实现 ZIP 暴力破解(教学演示)。依赖:仅标准库。"""importargparseimportitertoolsimportmultiprocessingasmpimportsysimporttimeimportzlibimportzipfile# ------------------------- 多进程 worker -------------------------_ZF=