Создайте зашифрованный ZIP файл в Python
Я создаю ZIP файл с ZipFile в Python 2.5, он работает нормально до сих пор:
import zipfile, os
locfile = "test.txt"
loczip = os.path.splitext (locfile)[0] + ".zip"
zip = zipfile.ZipFile (loczip, "w")
zip.write (locfile)
zip.close()
но я не смог найти, как зашифровать файлы в ZIP файле.
Я мог бы использовать систему и вызывать PKZIP -s, но я полагаю, что должен быть более "питонический" способ. Я ищу решение с открытым исходным кодом.
Ответы
Ответ 1
Я создал простую библиотеку для создания зашифрованного паролем zip файла в python. - здесь
import pyminizip
compression_level = 5 # 1-9
pyminizip.compress("src.txt", "dst.zip", "password", compression_level)
Для библиотеки требуется zlib.
Я проверил, что файл можно извлечь в WINDOWS/MAC.
Ответ 2
Повторяющийся вопрос fooobar.com/questions/183181/... рекомендует использовать 7z
вместо zip
. Мой опыт подтверждает это.
Скопируйте/вставьте ответ @JFSebastian здесь также для полноты:
Чтобы создать зашифрованный zip-архив (с именем 'myarchive.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
в P4$$W0rd
строке.
Или то же самое в Python 2. 6+:
>>> zipfile.ZipFile('myarchive.zip').extractall(pwd='P4$$W0rd')
Ответ 3
Вы можете использовать библиотеку 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()
Ответ 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')
Ответ 5
Ответ на @tripleee помог мне, см. мой тест ниже.
Этот код работает для меня на python 3.5.2 в Windows 8.1 ( 7z путь добавлен в систему).
rc = subprocess.call(['7z', 'a', output_filename + '.zip', '-mx9', '-pSecret^)'] + [src_folder + '/'])
С двумя параметрами:
-
-mx9
означает максимальное сжатие
-
-pSecret^)
означает, что пароль Secret^)
. ^
является escape для )
для ОС Windows, но при распаковке ему понадобится тип ^
.
Без ^
ОС Windows не будет применять пароль, когда 7z.exe создает файл zip.
Кроме того, если вы хотите использовать переключатель -mhe
, вам понадобится формат файла 7z вместо zip.
Я надеюсь, что это может помочь.