如何创建加密的ZIP文件?

问题描述 投票:0回答:9

我正在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 python-zipfile
9个回答
30
投票

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

import pyminizip

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

该库需要 zlib。

我已经检查过该文件可以在WINDOWS/MAC中提取。


9
投票

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

pyzipper

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

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

subprocess
,请使用 pyzipper...


8
投票

重复的问题:创建密码加密 zip 文件的代码? 有一个 答案,建议使用

7z
而不是
zip
。我的经历证明了这一点。

为了完整起见,也将 @jfs 的答案复制/粘贴到此处:

要使用开源

'myarchive.zip'
 实用程序创建加密的 zip 存档(名为 
7-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')

4
投票

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

2
投票

您可以使用 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 位。使用 setcryption() 方法指定加密 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


0
投票

@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 操作系统中
    )
    的转义符,但解压时需要输入
    ^

如果没有

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

此外,如果您想使用

-mhe
开关,则需要文件格式为 7z 而不是 zip

我希望这会有所帮助。


0
投票

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 上测试过)

0
投票

您现在可以使用 https://github.com/uktrade/stream-zip(完全披露:主要由我制作/维护)来制作符合 WinZip AE-2 规范的 AES-256 加密 ZIP 文件。

一小部分具体文档位于 https://stream-zip.docs.trade.gov.uk/advanced-usage/#password-protection-%2F-encryption,但要制作一个完整的工作示例:

import secrets
from datetime import datetime
from stat import S_IFREG

from stream_zip import ZIP_32, stream_zip

member_files = (
    (
        'my-file-1.txt',     # File name
        datetime.now(),      # Modification time
        S_IFREG | 0o600,     # Mode - regular file that owner can read and write
        ZIP_32,              # ZIP_32 has good support but limited to 4GiB
        (b'Some bytes 1',),  # Iterable of chunks of contents
    ),
    (
        'my-file-2.txt',
        datetime.now(),
        S_IFREG | 0o600,
        ZIP_32,
        (b'Some bytes 2',),
    ),
)

password = secrets.token_urlsafe(32)
encrypted_zipped_chunks = stream_zip(member_files, password=password)

with open('password-protected-zip', 'wb') as f:
    for encrypted_zipped_chunk in encrypted_zipped_chunks:
        f.write(encrypted_zipped_chunk)

此示例将源数据硬编码在内存中,然后保存到ZIP磁盘,但这不是stream-zip所要求的。源数据必须是

bytes
的可迭代对象,然后可以发送到接受
bytes
实例的可迭代对象的任何代码。


-1
投票

您可以使用 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()
© www.soinside.com 2019 - 2024. All rights reserved.