Создайте зашифрованный 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)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 + '/'])
С двумя параметрами:
-mx9
означает максимальное сжатие-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')