Crea un archivo ZIP encriptado en Python

Estoy creando un archivo ZIP con ZipFile en Python 2.5, funciona bien hasta ahora:

import zipfile, os locfile = "test.txt" loczip = os.path.splitext (locfile)[0] + ".zip" zip = zipfile.ZipFile (loczip, "w") zip.write (locfile) zip.close() 

pero no pude encontrar cómo cifrar los archivos en el archivo ZIP. Podría usar el sistema y llamar a PKZIP -s, pero supongo que debe haber una forma más “Pythonic”. Estoy buscando una solución de código abierto.

Creé una biblioteca simple para crear una contraseña cifrada en un archivo zip en Python. – aqui

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

La biblioteca requiere zlib.

He comprobado que el archivo se puede extraer en WINDOWS / MAC.

La pregunta duplicada https://stackoverflow.com/a/2366917/874188 recomienda usar 7z lugar de zip . Mi experiencia lo confirma.

Copia / pega la respuesta de @JFSebastian aquí también para completar:

Para crear un archivo zip encriptado (llamado 'myarchive.zip' ) usando la utilidad de 7-Zip abierto 7-Zip :

 rc = subprocess.call(['7z', 'a', '-mem=AES256', '-pP4$$W0rd', '-y', 'myarchive.zip'] + ['first_file.txt', 'second.file']) 

Para instalar 7-Zip, escriba:

 $ sudo apt-get install p7zip-full 

Para descomprimir a mano (para demostrar compatibilidad con utitity zip), escriba:

 $ unzip myarchive.zip 

E ingrese P4$$W0rd en el indicador.

O lo mismo en Python 2.6+:

 >>> zipfile.ZipFile('myarchive.zip').extractall(pwd='P4$$W0rd') 

Puede utilizar la biblioteca Chilkat . Es comercial, pero tiene una evaluación gratuita y parece bastante agradable.

Aquí hay un ejemplo que obtuve de aquí :

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

La respuesta de @ tripleee me ayudó, vea mi prueba a continuación.

Este código funciona para mí en Python 3.5.2 en Windows 8.1 (ruta 7z agregada al sistema).

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

Con dos parámetros:

  1. -mx9 significa compresión máxima
  2. -pSecret^) significa que la contraseña es Secret^) . ^ es escape para ) para el sistema operativo Windows, pero cuando lo descomprimas, necesitarás escribir el ^ .

Sin ^ Windows OS no aplicará la contraseña cuando 7z.exe cree el archivo zip .

Además, si desea utilizar el conmutador -mhe , necesitará el formato de archivo en 7z en lugar de zip .

Espero que eso pueda ayudar.