Zip加密文件的解密(Python版)

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()

解密脚本运行结果如下:

legacy破解结果.jpg

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()

解密脚本运行结果如下:

aes破解结果.jpg

04 总结

本文通过zipfile模块来解密Zip 2.0传统加密(CRC32)的zip文件,并通过pyzipper库来解密AES加密的Zip文件,其实pyzipper库同样可以用来解密Zip 2.0传统加密(CRC32)的zip文件,另外ARCHPR等常用工具也可以解密这两种加密压缩文件。

欢迎关注“网络安全与编程实践”

你可能感兴趣的:(Zip加密文件的解密(Python版))