[英]Create an encrypted ZIP file in Python (not compress existing file)
[英]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')
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 + '/'])
有两个参数:
-mx9
表示最大压缩-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)
您可以使用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.