☰
Python 实现 ZIP 暴力破解(zipfile + argparse 实战,4 台服务器分布式并行)
2026/10/12 17:36:12 网站建设 项目流程

Python 实现 ZIP 暴力破解(zipfile + argparse 实战,4 台服务器分布式并行)

本文面向有一定 Python 基础、想了解文件加密原理与并行计算实战的读者。通过一个完整可运行的例子,带你掌握zipfile与argparse两大标准库,并把破解任务横向扩展到 4 台云服务器,体验「分布式并行」带来的加速效果。


0. 法律与道德声明(必读)

本文所有代码仅用于合法授权场景下的学习与实践,例如:

  • 找回自己忘记密码的压缩包;
  • CTF / 安全攻防演练等授权测试环境。

严禁将其用于破解他人隐私、商业机密或任何你无权访问的文件。请遵守《网络安全法》等相关法律法规,后果自负。


1. 背景与原理

ZIP 是最常见的压缩格式之一。当勾选「加密」时,主流工具默认使用传统 PKWARE(ZipCrypto)加密。其破解思路非常简单:

  1. 拿到一个候选密码;
  2. 尝试用它解压 zip 里的某个文件;
  3. 密码正确 → 解压成功;密码错误 → 解密出的数据是随机噪声,解压/校验会失败。

把「候选密码」的来源分成两类:

方式候选来源适用场景
字典攻击密码词典文件(每行一个)密码可能来自常见弱口令
字符集暴力按字符集穷举所有组合已知密码规则(如 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.py

3. 知识点一:zipfile模块

zipfile是 Python 处理 zip 的标准库,本文用到以下关键 API:

API作用
zipfile.ZipFile(path)打开一个 zip 文件
zipfile.is_zipfile(path)判断是否为合法 zip
zf.infolist()列出内部成员元信息
info.flag_bits & 0x1判断该成员是否加密
zf.read(name, pwd=b'...')用密码读取(解压)某个成员

判断 zip 是否加密是破解前的必要校验:

importzipfilewithzipfile.ZipFile("secret.zip")asz:encrypted=any(info.flag_bits&0x1forinfoinz.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=

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询