Pregunta

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

El programa debe poder descargar un archivo todos los días cifrado 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 cifrados con la clave pública.

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

Todo lo que vi hasta ahora fue GNUPG, pero instalar eso en Windows hace cosas en el registro y arroja archivos dll en todas partes, y luego tengo que preocuparme si el usuario ya tiene esto instalado, cómo hacer una copia de seguridad de sus llaveros existentes, etc. preferiría tener una biblioteca de Python o una herramienta de línea de comandos y administrar las claves yo mismo.

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

¿Fue útil?

Solución

No necesita PyCrypto o PyMe , por muy buenos que sean esos paquetes, tendrá todo tipo de problemas al crear Windows. En cambio, ¿por qué no evitar las madrigueras de conejo y hacer lo que hice? Utilice gnupg 1.4.9 . No necesita realizar una instalación completa en las máquinas de usuario final: solo gpg.exe y iconv.dll de la distribución son suficientes, y solo necesita tener a ellos en algún lugar de la ruta o accedidos desde su código Python usando un nombre de ruta completo. No se necesitan cambios en el registro, y todo (ejecutables y archivos de datos) se puede limitar a una sola 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 aquí , pero tal cual está no es adecuado para Windows porque usa os.fork () . Aunque originalmente formaba 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 del GPG.py de Traugott, que utiliza el módulo 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 de una fuente externa (por ejemplo, claves públicas recibidas de una empresa asociada)
  • Cifrar y descifrar datos
  • Firmar y verificar 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 poder ordenarlo, agregar algunas pruebas unitarias más (no tengo pruebas unitarias para firmar / verificar, por ejemplo) y liberarlo (ya sea debajo la licencia original PyCrypto o una licencia comercial similar similar). Si no puede esperar, vaya con el módulo de Traugott y modifíquelo usted mismo; no fue demasiado trabajo hacerlo funcionar con el módulo 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 utilizado el mismo enfoque ( gpg.exe / iconv.dll ) con sistemas escritos en otros idiomas, p. C # , con resultados igualmente indoloros.

P.S. Funciona con Python 2.4, así como con Python 2.5 y versiones posteriores. No probado con otras versiones, aunque no preveo ningún problema.

Otros consejos

Después de MUCHA excavación, encontré un paquete que funcionó para mí. Aunque se dice que admite 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 basada en Python de OpenPGP (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 admite PGP, aunque debe probarlo para asegurarse de que funciona según sus especificaciones.

Aunque es difícil obtener documentación, si mira Util / test.py (el script de prueba del módulo), puede encontrar un ejemplo rudimentario de su soporte 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

PyMe reclama total compatibilidad con Python 2.4, y cito:

  

La última versión de PyMe (a partir de este   escrito) es v0.8.0. Es binario   la distribución para Debian fue compilada   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   distribución 'inestable' en el momento).   Su distribución binaria para Windows   fue compilado con SWIG v1.3.29 y   MinGW v4.1 para GPGME v1.1.6 y Python   v2.5.2 (aunque el mismo binario obtiene   instalado y funciona bien en v2.4.2 como   bien).

No estoy seguro de por qué dices "no parece ser compatible con Python 2.4, que tengo que usar". - detalles 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 tiene una biblioteca C que básicamente hace el trabajo.

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

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 cifrado en la entrada estándar de pgpv -f , lea la salida estándar de pgpv como texto plano descifrado.

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

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 se podrían crear con el nivel inferior RSA , módulos DSA etc. No conozco el interior de PGP, por lo que tendrías que desenterrar los detalles. Además, si sabe cómo generarlos utilizando los comandos de línea de comandos de openssl, debería ser razonablemente fácil convertir eso en llamadas M2Crypto.

Como otros han señalado, PyMe es la solución canónica para esto, ya que se basa en GpgME, que forma parte del ecosistema GnuPG.

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

Está basado en GnuPG 2, que, entre otras cosas, incluye gpg2.exe , que puede (finalmente, podría agregar :) iniciar gpg-agent.exe a pedido (gpg v1.x no puede).

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top