una txt imagenes funcion frase facil encriptar desencriptar con como codigo cifrado cesar archivos archivo python encryption public-key-encryption gnupg pgp

txt - encriptar imagenes con python



Cómo hacer PGP en Python(generar claves, cifrar/descifrar) (6)

Estoy haciendo un programa en Python para ser distribuido a los usuarios de Windows a través de un instalador.

El programa debe poder descargar un archivo todos los días encriptado con la clave pública del usuario y luego descifrarlo.

Así que necesito encontrar una biblioteca de Python que me permita generar claves PGP públicas y privadas, y también descifrar archivos encriptados con la clave pública.

¿Es esto algo pyCrypto hará (la documentación es nebulosa)? ¿Hay otras bibliotecas puras de Python? ¿Qué tal una herramienta de línea de comando independiente en cualquier idioma?

Todo lo que vi hasta ahora fue GNUPG, pero instalarlo en Windows hace cosas en el registro y arroja archivos dll en todas partes, y luego tengo que preocuparme si el usuario ya tiene instalado esto, cómo hacer copias de seguridad de sus llaveros existentes, etc. Prefiero solo tiene una biblioteca de python o una herramienta de línea de comandos y yo misma administraré las claves.

Actualización: pyME podría funcionar, pero no parece ser compatible con Python 2.4, que tengo que usar.


Como otros han notado, PyMe es la solución canónica para esto, ya que está basado en GpgME, que es parte del ecosistema GnuPG.

Para Windows, recomiendo utilizar Gpg4win como la distribución GnuPG, por dos razones:

Se basa en GnuPG 2, que, entre otras cosas, incluye gpg2.exe , que puede (finalmente, podría agregar :) iniciar gpg-agent.exe bajo demanda (gpg v1.x no puede).

Y en segundo lugar, es la única versión oficial de Windows desarrollada por los desarrolladores de GnuPG. Por ejemplo, está completamente compilado de forma cruzada desde Linux a Windows, por lo que no se utilizó ni una pizca de software no libre para prepararlo (bastante importante para una suite de seguridad :).


Después de MUCHA excavación, encontré un paquete que funcionó para mí. Aunque se dice que es compatible con la generación de claves, no lo probé. Sin embargo, logré descifrar un mensaje cifrado con una clave pública GPG. La ventaja de este paquete es que no requiere un archivo ejecutable GPG en la máquina, y es una implementación de OpenPGP basada en Python (en lugar de una envoltura alrededor del ejecutable). Creé las claves privadas y públicas usando GPG4win y Kleopatra para Windows. Vea mi código a continuación.

import pgpy emsg = pgpy.PGPMessage.from_file(<path to the file from the client that was encrypted using your public key>) key,_ = pgpy.PGPKey.from_file(<path to your private key>) with key.unlock(<your private key passpharase>): print (key.decrypt(emsg).message)

Aunque la pregunta es muy antigua. Espero que esto ayude a los futuros usuarios.


PyCrypto es compatible con PGP, aunque debe probarlo para asegurarse de que funciona según sus especificaciones.

Aunque la documentación es difícil de encontrar, si consulta Util / test.py (el script de prueba del módulo), puede encontrar un ejemplo rudimentario de su compatibilidad con PGP:

if verbose: print '' PGP mode:'', obj1=ciph.new(password, ciph.MODE_PGP, IV) obj2=ciph.new(password, ciph.MODE_PGP, IV) start=time.time() ciphertext=obj1.encrypt(str) plaintext=obj2.decrypt(ciphertext) end=time.time() if (plaintext!=str): die(''Error in resulting plaintext from PGP mode'') print_timing(256, end-start, verbose) del obj1, obj2

Además, PublicKey / pubkey.py proporciona los siguientes métodos relevantes:

def encrypt(self, plaintext, K) def decrypt(self, ciphertext): def sign(self, M, K): def verify (self, M, signature): def can_sign (self): """can_sign() : bool Return a Boolean value recording whether this algorithm can generate signatures. (This does not imply that this particular key object has the private information required to to generate a signature.) """ return 1


M2Crypto tiene un módulo PGP, pero en realidad nunca he intentado usarlo. Si lo prueba y funciona, hágamelo saber (soy el actual mantenedor de M2Crypto). Algunos enlaces:

Actualización: el módulo PGP no proporciona formas de generar claves, pero presumiblemente éstas podrían crearse con los módulos de nivel inferior RSA , DSA , etc. No conozco el interior de PGP, así que tendrías que desenterrar los detalles. Además, si sabe cómo generar estos utilizando comandos de línea de comando de openssl, debería ser razonablemente fácil convertir eso a llamadas de M2Crypto.


PyMe no reclama compatibilidad total con Python 2.4, y cito:

La última versión de PyMe (al momento de escribir esto) es v0.8.0. Su distribución binaria para Debian se compiló con SWIG v1.3.33 y GCC v4.2.3 para GPGME v1.1.6 y Python v2.3.5, v2.4.4 y v2.5.2 (proporcionado en la distribución ''inestable'' en ese momento). Su distribución binaria para Windows se compiló con SWIG v1.3.29 y MinGW v4.1 para GPGME v1.1.6 y Python v2.5.2 (aunque el mismo binario se instala y funciona bien también en v2.4.2).

No estoy seguro de por qué dices "no parece ser compatible con Python 2.4 que tengo que usar", ¿por favor, por favor?

Y sí existe como un contenedor semi-Pythonic (SWIGd) en GPGME - esa es una forma popular de desarrollar extensiones de Python una vez que tienes una biblioteca C que básicamente hace el trabajo.

PyPgp tiene un enfoque mucho más simple, es por eso que es una secuencia de comandos de Python simple y simple: básicamente no hace nada más que "shell out" a los comandos de PGP de la línea de comando. Por ejemplo, el descifrado es justo:

def decrypt(data): "Decrypt a string - if you have the right key." pw,pr = os.popen2(''pgpv -f'') pw.write(data) pw.close() ptext = pr.read() return ptext

es decir, escriba el texto cifrado encriptado en la entrada estándar de pgpv -f , lea la salida estándar de pgpv como texto cifrado descifrado.

PyPgp es también un proyecto muy antiguo, aunque su simplicidad significa que hacer que funcione con Python moderno (por ejemplo, subproceso en lugar de os.popen2 ahora en desuso) no sería difícil. Pero aún necesita PGP instalado, o PyPgp no hará nada ;-).


No necesita PyCrypto o PyMe , aunque esos paquetes sí pueden tener problemas, tendrá todo tipo de problemas en Windows. En cambio, ¿por qué no evitar los agujeros de conejo y hacer lo que hice? Use gnupg 1.4.9 . No es necesario realizar una instalación completa en equipos de usuario final: solo gpg.exe e iconv.dll de la distribución son suficientes, y solo necesita tenerlos en algún lugar de la ruta o acceder desde su código de Python usando un iconv.dll completo. nombre de ruta No se necesitan cambios en el registro, y todo (archivos ejecutables y datos) se puede limitar a una única carpeta si lo desea.

Hay un módulo GPG.py que fue escrito originalmente por Andrew Kuchling, mejorado por Richard Jones y mejorado por Steve Traugott. Está disponible here , pero tal como está no es adecuado para Windows porque usa os.fork() . Aunque originalmente era parte de PyCrypto , es completamente independiente de las otras partes de PyCrypto y solo necesita gpg.exe / iconv.dll para funcionar .

Tengo una versión ( gnupg.py ) derivada de GPG.py de Traugott, que usa el módulo de subprocess . Funciona bien en Windows, al menos para mis propósitos: lo uso para hacer lo siguiente:

  • Gestión de claves: generación, listado, exportación, etc.
  • Importar claves desde una fuente externa (por ejemplo, claves públicas recibidas de una empresa asociada)
  • Cifrar y descifrar datos
  • Firme y verifique las firmas

El módulo que tengo no es ideal para mostrar en este momento, porque incluye algunas otras cosas que no deberían estar allí, lo que significa que no puedo liberarlo tal como está en este momento. En algún momento, tal vez en las próximas semanas, espero ser capaz de ponerlo en orden, añadir algunas pruebas unitarias más (no tengo ninguna prueba unitaria para firmar / verificar, por ejemplo) y soltarlo (ya sea bajo la licencia PyCrypto original o una licencia comercial similar). Si no puede esperar, vaya con el módulo de Traugott y modifíquelo usted mismo; no fue demasiado trabajo para hacerlo funcionar con el módulo de subprocess .

Este enfoque fue mucho menos doloroso que los otros (por ejemplo, soluciones basadas en SWIG , o soluciones que requieren construcción con MinGW / MSYS ), que consideré y experimenté. He usado el mismo gpg.exe ( gpg.exe / iconv.dll ) con sistemas escritos en otros idiomas, por ejemplo C# , con resultados igualmente indoloros.

PS Funciona con Python 2.4 y con Python 2.5 y versiones posteriores. No probado con otras versiones, aunque no preveo ningún problema.