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

Ответов (6)

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

import pyminizip

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

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

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

Ответ @ 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^). ^- это выход для )ОС Windows, но при распаковке нужно будет ввести расширение ^.

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

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

Надеюсь, это поможет.

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

Эта ветка немного устарела, но для людей, которые ищут ответ на этот вопрос в 2020/2021 году.

Посмотри на pyzipper

100% совместимая с API замена zip-файла Python, который может читать и записывать zip-файлы с шифрованием AES.

7-zip - тоже хороший выбор, но если вы не хотите использовать subprocess, используйте pyzipper ...

Вы можете использовать библиотеку 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()

Повторяющийся вопрос https://answacode.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')