01 概述
Zip加密文件通常可采用ARCHPR等工具进行解密。本文为理解其原理,自己编写Python脚本来解密zip加密文件。
Zip加密文件的加密算法通常包括AES和Zip 2.0传统加密(CRC32)算法,针对采用不同加密算法的压缩文件,应采用不同的解密方式进行解密。
本实验用的zip加密文件是通过WinRAR进行创建的,当前WinRAR默认采用AES-256进行加密,WinRAR也可以选择通过Zip 2.0传统加密(CRC32)算法进行加密。
Python标准库中的zipfile模块只支持Zip 2.0传统加密(CRC32)的zip文件,不能解密AES加密的Zip文件;如果要解密AES加密的Zip文件,需要用到pyzipper库。
本文通过zipfile模块来解密Zip 2.0传统加密(CRC32)的zip文件,通过pyzipper库来解密AES加密的Zip文件。
02 传统加密Zip文件的解密
我们通过WinRAR创建一个采用Zip 2.0传统加密(CRC32)算法的Zip文件,文件名为legacy.zip,设置密码时要勾选“ZIP传统加密”。
针对legacy.zip文件,采用zipfile模块进行解密,解密脚本如下:
import zipfile
from threading import Thread
def extractFile(zFile, password):
try:
# 尝试使用密码去解压
zFile.extractall(pwd=password.encode('cp850', 'replease'))
print("[+] Found password: " + password)
except:
pass #解压失败说明密码错误,跳过
def main():
zname = "legacy.zip" # 采用Zip传统加密算法的压缩文件
dname = "password_dict.txt" # 字典文件,每行一个密码
zFile = zipfile.ZipFile(zname)
passFile = open(dname)
for line in passFile.readlines():
password = line.strip()
t = Thread(target=extractFile, args=(zFile, password)) # 启用一个线程去解压
t.start()
if __name__ == '__main__':
main()
解密脚本运行结果如下:
03 AES加密Zip文件的解密
我们通过WinRAR创建一个AES-256加密的Zip文件,文件名为aes.zip,设置密码时采用默认模式,不要勾选“ZIP传统加密”。
针对aes.zip文件,采用pyzipper库进行解密,解密脚本如下:
# 首先得安装pyzipper库,pip insall pyzipper
import pyzipper
from threading import Thread
def extractFile(zip_file, password):
with pyzipper.AESZipFile(zip_file, 'r', compression=pyzipper.ZIP_LZMA, encryption=pyzipper.WZ_AES) as f:
f.setpassword(password.encode('utf-8'))
try:
f.extractall() #使用密码尝试解压
print("[+] Found password: " + password)
except:
pass #解压失败说明密码错误,跳过
def main():
# 采用AES默认加密算法的压缩文件
zip_file_name = "aes.zip"
# 字典文件,每行为一个密码
dict_name = "password_dict.txt"
dict_file = open(dict_name)
for line in dict_file.readlines():
password = line.strip()
# 启用一个线程去解压
t = Thread(target=extractFile, args=(zip_file_name, password))
t.start()
if __name__ == '__main__':
main()
解密脚本运行结果如下:
04 总结
本文通过zipfile模块来解密Zip 2.0传统加密(CRC32)的zip文件,并通过pyzipper库来解密AES加密的Zip文件,其实pyzipper库同样可以用来解密Zip 2.0传统加密(CRC32)的zip文件,另外ARCHPR等常用工具也可以解密这两种加密压缩文件。
欢迎关注“网络安全与编程实践”