我正在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中提取。
这个帖子有点旧了,但对于 2020/2021 年寻找这个问题答案的人来说。
Python zipfile 的 100% API 兼容替代品,可以读取和写入 AES 加密的 zip 文件。
7-zip 也是一个不错的选择,但如果你不想使用
subprocess
,请使用 pyzipper...
重复的问题:创建密码加密 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')
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')
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
@tripleee 的回答对我有帮助,请参阅下面的测试。
此代码适用于 Windows 8.1 上的 python 3.5.2(7z 路径已添加到系统)。
rc = subprocess.call(['7z', 'a', output_filename + '.zip', '-mx9', '-pSecret^)'] + [src_folder + '/'])
有两个参数:
-mx9
表示最大压缩-pSecret^)
表示密码是Secret^)
。 ^
是 Windows 操作系统中 )
的转义符,但解压时需要输入 ^
。如果没有
^
,当 7z.exe 创建 zip 文件时,Windows 操作系统将不会应用密码。
此外,如果您想使用
-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)
您现在可以使用 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
实例的可迭代对象的任何代码。
您可以使用 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()