Создать зашифрованный 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. Я мог бы использовать system и вызывать PKZIP -s, но я полагаю, что должен быть более "Pythonic" способ. Я ищу решение с открытым исходным кодом.

20.08.2008 00:16:40
решение с открытым исходным кодом stackoverflow.com/questions/2195747/…
jfs 6.04.2010 19:42:40
5 ОТВЕТОВ

Вы можете использовать библиотеку 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()
-1
1.05.2013 00:57:03
Я уже видел примеры Chilkat, но я ищу вариант с открытым исходным кодом (извините, не упомянул об этом в моем исходном сообщении), я продолжаю искать в Google, но без удачи.
PabloG 20.08.2008 02:00:44

Я создал простую библиотеку для создания зашифрованного паролем zip-файла в python. - здесь

import pyminizip

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

Библиотека требует zlib.

Я проверил, что файл может быть извлечен в WINDOWS / MAC.

19
1.05.2013 00:52:47
Он доступен через pip install pyminizip
shadowbq 8.12.2014 20:13:07
Не работает со следующим: Python 3.5 через Anaconda (Jupyter Notebook): создал безопасный zip-файл, но пароль, который я использовал для его создания, не открывает папку! Сын щенка!
Dance Party 3.06.2016 01:18:57

Двойной вопрос https://stackoverflow.com/a/2366917/874188 рекомендует использовать 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в подсказку.

Или то же самое в Python 2.6+:

>>> zipfile.ZipFile('myarchive.zip').extractall(pwd='P4$$W0rd')
6
22.05.2019 00:23:24

Ответ @ tripleee помог мне, см. мой тест ниже.

Этот код работает для меня на Python 3.5.2 на Windows 8.1 ( путь 7z добавлен в систему).

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

С двумя параметрами:

  1. -mx9 означает максимальное сжатие
  2. -pSecret^)значит пароль есть Secret^). ^это escape для )ОС Windows, но когда вы разархивируете, нужно будет ввести ^.

Без ^Windows ОС не будет применять пароль при создании 7z.exe файла zip .

Кроме того, если вы хотите использовать -mheпереключатель, вам понадобится формат файла 7z вместо zip .

Я надеюсь, что это может помочь.

-1
20.10.2016 21:58:44

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')
1
8.08.2019 04:47:15