实战指南:Python自动化破解ZIP加密文件的两种武器——字典与暴力

张开发
2026/4/13 2:01:18 15 分钟阅读

分享文章

实战指南:Python自动化破解ZIP加密文件的两种武器——字典与暴力
1. 当ZIP密码遗忘时Python能做什么遇到加密的ZIP文件却忘记密码这种尴尬情况很多人都遇到过。上周我就帮同事找回了一个存放重要项目文档的压缩包密码。作为Python开发者我们完全可以用代码自动化解决这个问题。核心思路有两种字典攻击和暴力破解。前者像用万能钥匙挨个试锁后者则像从000开始逐个拨动密码轮。这两种方法我都实战测试过。比如用字典攻击我成功在3分钟内破解了同事设置的2024project这种常见密码而面对8位随机密码时改用暴力破解配合字符集优化后花了6小时才突破。选择哪种方法关键要看你对密码强度的预判。2. 字典攻击智能猜密码的艺术2.1 原理与实战准备字典攻击的核心在于常见密码库。就像小偷会先试123456、password这些常见组合一样我们可以准备包含百万级常见密码的文本文件。我常用的rockyou.txt字典就收录了真实泄露的1400万密码。先安装必要库pip install tqdm zipfile2.2 完整代码实现from zipfile import ZipFile from tqdm import tqdm def crack_with_dict(zip_path, dict_path): with ZipFile(zip_path) as zf: with open(dict_path, r, encodingutf-8, errorsignore) as f: for pwd in tqdm(f, desc尝试密码): try: zf.extractall(pwdpwd.strip().encode()) print(f\n破解成功密码是{pwd.strip()}) return True except: continue return False # 使用示例 crack_with_dict(secret.zip, rockyou.txt)关键点说明tqdm库提供进度条直观显示尝试进度错误处理确保程序遇到错误密码时不会中断编码处理避免字典文件中有特殊字符时报错3. 暴力破解穷尽所有可能3.1 何时选择暴力破解当遇到以下几种情况时字典攻击往往失效密码是完全随机的字符组合使用了不常见的密码规则密码中包含特殊组合如a1!b2这时就需要暴力破解出场了。我去年破解一个7位混合密码时通过优化字符集将时间从预估的3天缩短到8小时。3.2 优化后的暴力破解代码import itertools from zipfile import ZipFile def brute_force(zip_path, max_length8, charsNone): if not chars: chars abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 with ZipFile(zip_path) as zf: for length in range(1, max_length1): for attempt in itertools.product(chars, repeatlength): pwd .join(attempt) try: zf.extractall(pwdpwd.encode()) print(f\n破解成功密码是{pwd}) return True except: continue return False # 使用示例已知密码是4位数字 brute_force(data.zip, max_length4, chars0123456789)性能优化技巧通过chars参数缩小字符范围如确认只用数字合理设置max_length避免无意义的长密码尝试使用itertools.product生成密码组合效率最高4. 实战对比与选择策略4.1 速度对比测试我用同一个1GB的ZIP文件做了组对照实验方法密码强度耗时尝试次数字典攻击admin12328秒1,402次暴力破解X7!n4小时约78万次混合模式2024!pw9分钟5万次4.2 智能混合破解方案结合两者优势我开发了分阶段破解策略先尝试top1000常用密码耗时1秒再尝试字典变形如密码年份最后按字符集分级暴力破解def hybrid_crack(zip_path): # 阶段1快速尝试常见密码 if crack_with_dict(zip_path, top1000.txt): return # 阶段2字典变形 with open(base_dict.txt) as f: for word in f: for year in [2023,2024,2025]: attempt f{word.strip()}{year} # 尝试逻辑... # 阶段3分级暴力破解 brute_force(zip_path, max_length6)5. 破解过程中的实用技巧5.1 密码心理学应用根据统计80%的人设置密码会遵循以下模式姓名/生日组合如zhang1988键盘相邻键如qwer1234常见单词符号如love!我在代码中专门增加了这类模式生成器def generate_common_patterns(): # 键盘相邻键组合 keyboard [qwertyuiop, asdfghjkl, zxcvbnm] # 姓名年份组合 names [zhang, li, wang] years [str(y) for y in range(1980, 2025)] return [ny for n in names for y in years] keyboard5.2 分布式破解方案当面对超长复杂密码时我用过多台服务器并行破解。核心思路是将密码空间分块# 主节点 passwords itertools.product(abcde, repeat5) chunks divide_into_chunks(passwords, worker_count4) # 工作节点 def worker(start, end): for pwd in passwords[start:end]: # 尝试破解...记得去年用10台AWS实例并行8小时就完成了原需3天的破解任务。不过要注意云服务商对这类计算任务的限制政策。

更多文章