繁体   English   中英

如何创建加密的 ZIP 文件?

[英]How to create an encrypted ZIP file?

我正在使用 Python 2.5 中的ZipFile创建一个 ZIP 文件,到目前为止它工作正常:

import zipfile, os

locfile = "test.txt"
loczip = os.path.splitext (locfile)[0] + ".zip"
zip = zipfile.ZipFile (loczip, "w")
zip.write (locfile)
zip.close()

但我找不到如何加密 ZIP 文件中的文件。 我可以使用 system 并调用PKZIP -s ,但我想必须有一种更“Pythonic”的方式。 我正在寻找一个开源解决方案。

我创建了一个简单的库来在 python 中创建密码加密的 zip 文件。 -这里

import pyminizip

compression_level = 5 # 1-9
pyminizip.compress("src.txt", "dst.zip", "password", compression_level)

该库需要 zlib。

我检查了该文件是否可以在 WINDOWS/MAC 中提取。

重复的问题: 创建密码加密 zip 文件的代码? 有一个建议使用7z而不是zip答案 我的经验证明了这一点。

为了完整起见,@jfs 也在这里复制/粘贴答案:

要使用开源7-Zip实用程序创建加密的 zip 存档(名为'myarchive.zip' ):

rc = subprocess.call(['7z', 'a', '-mem=AES256', '-pP4$$W0rd', '-y', 'myarchive.zip'] + 
                     ['first_file.txt', 'second.file'])

要安装 7-Zip,请键入:

$ sudo apt-get install p7zip-full

要手动解压缩(以证明与 zip 实用程序的兼容性),请键入:

$ unzip myarchive.zip

并在提示符处输入P4$$W0rd

或在 Python 2.6+ 中相同:

>>> zipfile.ZipFile('myarchive.zip').extractall(pwd='P4$$W0rd')

这个帖子有点老了,但对于在 2020/2021 年寻找这个问题的答案的人来说。

看看pyzipper

Python 的 zipfile 的 100% API 兼容替代品,可以读写 AES 加密的 zip 文件。

7-zip 也是一个不错的选择,但是如果你不想使用subprocess ,就用 pyzipper ...

pyminizip非常适合创建受密码保护的 zip 文件。 对于解压缩,它在某些情况下会失败。 在 python 3.7.3 上测试

在这里,我使用 pyminizip 来加密文件。

import pyminizip
compression_level = 5 # 1-9
pyminizip.compress("src.txt",'src', "dst.zip", "password", compression_level)

对于解压缩,我使用了 zip 文件模块:

from zipfile import ZipFile

with ZipFile('/home/paulsteven/dst.zip') as zf:
    zf.extractall(pwd=b'password')

您可以使用 pyzipper 完成此任务,当您想要加密 zip 文件或生成受保护的 zip 文件时,它会非常有用。

pip install pyzipper

import pyzipper

def encrypt_():

    secret_password = b'your password'

    with pyzipper.AESZipFile('new_test.zip',
                             'w',
                             compression=pyzipper.ZIP_LZMA,
                             encryption=pyzipper.WZ_AES) as zf:
        zf.setpassword(secret_password)
        zf.writestr('test.txt', "What ever you do, don't tell anyone!")

    with pyzipper.AESZipFile('new_test.zip') as zf:
        zf.setpassword(secret_password)
        my_secrets = zf.read('test.txt')

AES 加密的强度可以配置为 128、192 或 256 位。 默认为 256 位。 使用 setencryption() 方法指定加密 kwargs:

def encrypt_():
    
    secret_password = b'your password'

    with pyzipper.AESZipFile('new_test.zip',
                             'w',
                             compression=pyzipper.ZIP_LZMA) as zf:
        zf.setpassword(secret_password)
        zf.setencryption(pyzipper.WZ_AES, nbits=128)
        zf.writestr('test.txt', "What ever you do, don't tell anyone!")

    with pyzipper.AESZipFile('new_test.zip') as zf:
        zf.setpassword(secret_password)
        my_secrets = zf.read('test.txt')

官方 Python ZipFile 文档可在此处获得: https ://docs.python.org/3/library/zipfile.html

@tripleee 的回答对我有帮助,请参阅下面的测试。

此代码适用于 Windows 8.1 上的 python 3.5.2(将7z路径添加到系统)。

rc = subprocess.call(['7z', 'a', output_filename + '.zip', '-mx9', '-pSecret^)'] + [src_folder + '/'])

有两个参数:

  1. -mx9表示最大压缩
  2. -pSecret^)表示密码为Secret^) ^)对于 Windows 操作系统的转义,但是当你解压缩时,它需要输入^

如果没有^ ,Windows 操作系统将不会在 7z.exe 创建zip文件时应用密码。

此外,如果您想使用-mhe开关,则需要文件格式为7z而不是zip

我希望这可能会有所帮助。

2022年答案:

我相信这是一项非常平凡的任务,因此应该是oneliner 我在一个与 bash 终端一样强大的库中抽象出所有琐碎的细节。

from crocodile.toolbox import Path

file = Path(r'my_string_path')
result_file = file.zip(pwd="lol", use_7z=True)
  • 当 7z 标志被升起时,它会在幕后被调用。
    • 您无需学习 7z 命令行语法。
    • 您无需担心安装 7z,如果未安装,它会自动安装。 (到目前为止在 Windows 上测试过)

您可以使用Chilkat库。 它是商业的,但有免费评估,看起来很不错。

这是我从这里得到的一个例子:

import chilkat

# Demonstrates how to create a WinZip-compatible 128-bit AES strong encrypted zip
zip = chilkat.CkZip()
zip.UnlockComponent("anything for 30-day trial")

zip.NewZip("strongEncrypted.zip")

# Set the Encryption property = 4, which indicates WinZip compatible AES encryption.
zip.put_Encryption(4)
# The key length can be 128, 192, or 256.
zip.put_EncryptKeyLength(128)
zip.SetPassword("secret")

zip.AppendFiles("exampleData/*",True)
zip.WriteZip()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM