ZIP文件加密机制深度解析——从伪加密到真加密的攻防实战
在 CTF 竞赛和日常的文件分析中我们经常会遇到声称需要密码但实际上内容并未加密的 ZIP 文件这就是所谓的“伪加密”。本专题将深入解析 ZIP 文件格式中控制加密状态的关键字节揭示伪加密的原理与破解方法并通过实战案例来加深理解。一、ZIP 伪加密是什么ZIP 文件格式是一个开放标准它通过文件头中的特定标识来告知解压软件如 WinRAR, 7-Zip文件是否被加密。伪加密Pseudo-Encryption是指 ZIP 文件在文件头中标记为加密但实际上并未对文件内容进行真正的加密处理的一种技术手段。 它通过修改 ZIP 文件格式中的特定标志位使解压工具误以为文件被加密从而要求输入密码而实际上文件内容仍为明文可直接提取。伪加密通常用于 CTF 竞赛、软件保护测试、文件隐藏等场景是一种典型的“结构欺骗”技术。二、ZIP 文件结构基础要理解伪加密必须先了解 ZIP 文件的基本结构。ZIP 文件由三部分组成1. 本地文件头Local File Header标识一个文件的开始。结构标志50 4B 03 04PK头。包含文件名、压缩方法、修改时间、CRC 等元信息。关键字段通用位标记General Purpose Bit Flag位于第 7-8 字节用于标识是否加密。2. 文件数据区File Data存储文件的实际压缩内容。3. 中央目录头Central Directory Header位于 ZIP 文件末尾用于快速索引。结构标志50 4B 01 02。包含与本地文件头相似的信息也包括通用位标记。4. 中央目录结束标识End of Central Directory Record标志 ZIP 文件的结束。三、加密标志位解析ZIP 加密状态由通用位标记General Purpose Bit Flag控制位置本地文件头偏移0x06-0x07第 7-8 字节中央目录头偏移0x08-0x09第 9-10 字节含义00 00无加密09 00加密标志AES 或 ZipCrypto00 09伪加密常见标志之一场景修改行为软件表现结果无加密 → 伪加密将 CDH 的00 00改为09 00软件打开时提示输入密码。无论输什么密码或留空都可能报错或者显示加密但无法正常解压。真加密 → 强行改 00将 LFH 和 CDH 都改为00 00软件认为没加密直接尝试解压。失败。因为实际数据是乱码解压出的文件会损坏或报 CRC 错误。伪加密 → 破解将 CDH 的09 00改回00 00软件认为没加密不再索要密码。成功。因为数据本身就是明文直接提取。四、真加密 vs 伪加密 vs 无加密类型本地文件头标志中央目录头标志实际加密无加密00 0000 00❌伪加密00 0009 00❌真加密09 0009 00✅注意部分工具或不同压缩算法可能使用01 00、11 00等不同标志但09 00是最常见的加密标志。为什么 00 00 / 09 00 不可能是真加密真加密的逻辑 当你在压缩软件里输入密码点击“确定”时软件会做两件事第一修改所有标志位为 09 00第二使用加密算法如 AES 或 ZipCrypto将你的文件内容File Data全部打乱成乱码。伪加密的逻辑 这种操作通常是手动用十六进制编辑器修改的。它只改了“中央目录头”的标志位却没有对“文件数据区”的内容做任何算法处理。核心结论 如果标志位是 00 00 / 09 00而数据区的内容依然是明文比如依然能看到图片的文件头 FF D8 或 PNG 头那么它百分之百是伪加密。判定维度伪加密 (00 00 / 09 00)真加密 (09 00 / 09 00)本地文件头 (LFH) 标志00 00声明我没加密09 00声明我已加密中央目录头 (CDH) 标志09 00声明此项已加密09 00声明此项已加密实际文件数据明文。只要强制跳过弹窗数据能直接看。密文。不通过算法和正确密钥数据就是一堆无意义的乱码。解压软件行为弹出密码框但无论输什么大概率都报错或者通过修改标志位能直接破解。弹出密码框必须输入正确密码才能解密回原始数据。###五、伪加密的识别与破解识别方法判定维度伪加密 (00 00 / 09 00)真加密 (09 00 / 09 00)本地文件头 (LFH) 标志00 00声明我没加密09 00声明我已加密中央目录头 (CDH) 标志09 00声明此项已加密09 00声明此项已加密实际文件数据明文。只要强制跳过弹窗数据能直接看。密文。不通过算法和正确密钥数据就是一堆无意义的乱码。解压软件行为弹出密码框但无论输什么大概率都报错或者通过修改标志位能直接破解。弹出密码框必须输入正确密码才能解密回原始数据。破解方法将中央目录头中的09 00修改为00 00即可解除伪加密保护。 例如找到50 4B 01 02其后第 9-10 字节为09 00。修改为00 00保存文件。重新解压无需密码即可提取文件。六、实战案例CTF 中的伪加密利用案例MISC1 什么密码题目文件为 ZIP 格式尝试解压要求密码。分析十六进制结构发现为伪加密。修改标志位后解压得到一张图片进一步在图片末尾发现 Base64 编码的 flag。1.查找十六进制中的50 4B2.把50 4B 03 04后的第3、4个byte改成0000再把50 4B 01 02后的第5、6个byte改成0000即可破解伪加密。得到一张图片查看图片信息在最后看到如下内容是BASE64的顺序表七、真加密破解工具简介补充内容虽然本专题以伪加密为主但在实际CTF比赛中真加密也经常出现。以下简要介绍常用的ZIP真加密破解工具7.1 工具概览工具名称平台特点适用场景ARCHPRWindows图形界面操作简单快速破解、弱密码John the Ripper跨平台命令行功能强大字典攻击、掩码攻击hashcat跨平台GPU加速速度快复杂密码破解fcrackzipLinux轻量级专攻ZIP简单密码破解7.2 工具使用示例ARCHPR/John the Ripper题目背景题目文件为misc100实际为ZIP压缩包需要密码破解。方法一——ARCHPR1.解压后得到misc100用kali看它的文件类型看到是压缩包格式所以先改变它的后缀再进行解压。2.解压时需要密码用ARCHPR直接暴力破解就能得到口令是fish这就是密码用它解压就能看到flag.txt。方法二——John the Ripper用著名的密码破解工具John the Ripper来解决1.因为在用winhex打开解压出来的misc100的时候能看到这个压缩包里有一个flag.txt.sudo apt update sudo apt install john #这里是安装 John the Ripper cd ~/Desktop zip2john misc100 hash.txt #使用zip2john工具提取哈希这个工具通常随 John 一起安装。它会把破解密码所需的信息从压缩包中提取出来保存到一个新的文件中这里我们命名为 hash.txt2.打开得到的hash.txt对这个文件进行进一步破解。首先要下载一个rockyou.txt字典sudo apt update sudo apt install wordlists #先下载wordlists包 sudo find / -name *rockyou* -type f 2/dev/null #查找rockyou字典的位置应该是在/usr/share/wordlists/rockyou.txt.gz sudo gunzip /usr/share/wordlists/rockyou.txt.gz #如果是以.gz结尾的要先进行这一步进行解压3.已获得字典用John进行破解可以看到fish就是对应txt的密码cd ~/Desktop john --wordlist/usr/share/wordlists/rockyou.txt hash.txt4.用fish解压misc100就能在桌面得到flag.txt。八、总结与思考伪加密是一种通过修改 ZIP 文件结构标志位实现“假加密”的技术。其核心在于通用位标记的不一致本地文件头无加密中央目录头标记加密。破解方法简单修改中央目录头的加密标志为00 00。在 CTF 中常见于 MISC、Forensics 题型常与隐写、编码等结合。安全启示结构安全不等于内容安全真正的保护应基于加密算法而非格式欺骗。附录伪加密检测 Python 脚本示例import sys def fix_pseudo_encryption(zip_file): 修复伪加密的 ZIP 文件 try: with open(zip_file, rb) as f: data bytearray(f.read()) central_pos data.rfind(bPK\x01\x02) if central_pos -1: print(❌ 错误: 找不到中央目录头) return # 修改中央目录头的加密标志 (09 00 - 00 00) data[central_pos8] 0x00 data[central_pos9] 0x00 # 保存为新文件 new_file zip_file.replace(.zip, _fixed.zip) with open(new_file, wb) as f: f.write(data) print(f✅ 修复完成!) print(f 新文件: {new_file}) except Exception as e: print(f❌ 错误: {e}) if __name__ __main__: if len(sys.argv) ! 2: print(f使用方法: python {sys.argv[0]} ZIP文件) else: fix_pseudo_encryption(sys.argv[1])专题总结 ZIP 伪加密是一种典型的“格式欺骗”技术通过结构标志位误导解压工具。虽然破解简单但在 CTF 和文件分析中具有重要教学意义体现了“结构即信息”的安全分析思想。在实际开发与安全测试中应理解其原理避免误用并掌握真正的加密保护方法。