Domanda

Sto creando un programma in Python da distribuire agli utenti di Windows tramite un programma di installazione.

Il programma deve essere in grado di scaricare un file ogni giorno crittografato con la chiave pubblica dell'utente e quindi decrittografarlo.

Quindi ho bisogno di trovare una libreria Python che mi permetta di generare chiavi PGP pubbliche e private e anche di decrittografare i file crittografati con la chiave pubblica.

È qualcosa che farà pyCrypto (la documentazione è nebulosa)? Ci sono altre librerie Python pure? Che ne dici di uno strumento da riga di comando autonomo in qualsiasi lingua?

Tutto quello che ho visto finora è stato GNUPG ma l'installazione su Windows fa cose nel registro e lancia dll ovunque, e quindi devo preoccuparmi se l'utente ha già installato questo, come fare il backup dei loro portachiavi esistenti, ecc. I preferirei semplicemente avere una libreria Python o uno strumento da riga di comando e gestire le chiavi da solo.

Aggiornamento: pyME potrebbe funzionare ma non sembra essere compatibile con Python 2.4 che devo usare.

È stato utile?

Soluzione

Non hai bisogno di PyCrypto o PyMe , anche se questi pacchetti potrebbero essere: avrai tutti i tipi di problemi che si creano sotto Windows. Invece, perché non evitare le tane del coniglio e fare quello che ho fatto? Usa gnupg 1.4.9 . Non è necessario eseguire un'installazione completa sui computer degli utenti finali: solo gpg.exe e iconv.dll dalla distribuzione sono sufficienti e è sufficiente da qualche parte nel percorso o accessibile dal codice Python usando un percorso completo. Non sono necessarie modifiche al registro e tutto (file eseguibili e file di dati) può essere confinato in una singola cartella, se lo si desidera.

C'è un modulo GPG.py che è stato originariamente scritto da Andrew Kuchling, migliorato da Richard Jones e ulteriormente migliorato da Steve Traugott. È disponibile qui , ma così com'è non adatto a Windows perché utilizza os.fork () . Sebbene originariamente parte di PyCrypto , è completamente indipendente dalle altre parti di PyCrypto e per funzionare .

Ho una versione ( gnupg.py ) derivata dal GPG.py di Traugott, che utilizza il modulo subprocess . Funziona bene su Windows, almeno per i miei scopi - lo uso per fare quanto segue:

  • Gestione delle chiavi - generazione, elenco, esportazione ecc.
  • Importa chiavi da una fonte esterna (ad es. chiavi pubbliche ricevute da una società partner)
  • Crittografa e decodifica i dati
  • Firma e verifica le firme

Il modulo che ho non è l'ideale da mostrare in questo momento, perché include alcune altre cose che non dovrebbero essere lì - il che significa che al momento non posso rilasciarlo così com'è. Ad un certo punto, forse nelle prossime due settimane, spero di essere in grado di riordinare, aggiungere altri test unitari (non ho test unitari per firmare / verificare, per esempio) e rilasciarlo (sia sotto la licenza PyCrypto originale o una licenza simile per uso commerciale). Se non puoi aspettare, vai con il modulo di Traugott e modificalo tu stesso - non è stato troppo lavoro per farlo funzionare con il modulo subprocess .

Questo approccio è stato molto meno doloroso delle altre (ad esempio soluzioni basate su SWIG o soluzioni che richiedono la costruzione con MinGW / MSYS ), che ho considerato e sperimentato. Ho usato lo stesso approccio ( gpg.exe / iconv.dll ) con sistemi scritti in altre lingue, ad es. C # , con risultati altrettanto indolori.

P.S. Funziona con Python 2.4 e Python 2.5 e versioni successive. Non testato con altre versioni, anche se non prevedo alcun problema.

Altri suggerimenti

Dopo aver MOLTO scavato, ho trovato un pacchetto che ha funzionato per me. Sebbene si dice che supporti la generazione di chiavi, non l'ho testato. Tuttavia sono riuscito a decrittografare un messaggio crittografato utilizzando una chiave pubblica GPG. Il vantaggio di questo pacchetto è che non richiede un file eseguibile GPG sulla macchina ed è un'implementazione basata su Python di OpenPGP (piuttosto che un wrapper attorno all'eseguibile). Ho creato le chiavi private e pubbliche usando GPG4win e kleopatra per Windows Vedi il mio codice qui sotto.

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)

Sebbene la domanda sia molto antica. Spero che questo aiuti i futuri utenti.

PyCrypto supporta PGP, anche se dovresti testarlo per assicurarti che funzioni secondo le tue specifiche.

Sebbene sia difficile trovare documentazione, se si guarda Util / test.py (lo script di test del modulo), è possibile trovare un esempio rudimentale del loro supporto 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

Inoltre, PublicKey / pubkey.py prevede i seguenti metodi pertinenti:

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 rivendica la piena compatibilità con Python 2.4 e cito:

  

L'ultima versione di PyMe (a partire da questo   scrittura) è v0.8.0. È binario   la distribuzione per Debian è stata compilata   con SWIG v1.3.33 e GCC v4.2.3 per   GPGME v1.1.6 e Python v2.3.5,   v2.4.4 e v2.5.2 (fornito in   distribuzione "instabile" al momento).   La sua distribuzione binaria per Windows   è stato compilato con SWIG v1.3.29 e   MinGW v4.1 per GPGME v1.1.6 e Python   v2.5.2 (sebbene ottenga lo stesso binario   installato e funziona bene in v2.4.2 come   bene).

Non sono sicuro del motivo per cui dici " non sembra essere compatibile con Python 2.4 che devo usare " - specifiche per favore?

E sì, esiste come wrapper semi-Pythonic (SWIGd) su GPGME - questo è un modo popolare per sviluppare estensioni Python una volta che hai una libreria C che sostanzialmente fa il lavoro.

PyPgp ha un approccio molto più semplice - ecco perché un singolo, semplice script Python: sostanzialmente non fa altro che "sborsare" ai comandi PGP della riga di comando. Ad esempio, la decrittazione è 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

vale a dire scrivere il testo cifrato nell'input standard di pgpv -f , leggere l'output standard di pgpv come testo in chiaro decrittografato.

PyPgp è anche un progetto molto vecchio, sebbene la sua semplicità significhi che farlo funzionare con Python moderno (ad es. sottoprocesso invece di os.popen2 ora deprecato) non sarebbe difficile. Ma hai ancora bisogno di PGP installato, o PyPgp non farà nulla ;-).

M2Crypto ha un modulo PGP, ma in realtà non ho mai provato ad usarlo. Se lo provi e funziona, per favore fammi sapere (io sono l'attuale manutentore M2Crypto). Alcuni link:

Aggiornamento: il modulo PGP non fornisce modi per generare chiavi, ma presumibilmente queste potrebbero essere create con il livello inferiore RSA , moduli DSA ecc. Non conosco gli interni di PGP, quindi dovresti scavare i dettagli. Inoltre, se sai come generarli usando i comandi della riga di comando openssl, dovrebbe essere ragionevolmente facile convertirlo in chiamate M2Crypto.

Come altri hanno notato, PyMe è la soluzione canonica per questo, poiché si basa su GpgME, che fa parte dell'ecosistema GnuPG.

Per Windows, consiglio vivamente di usare Gpg4win come distribuzione GnuPG, per due motivi:

Si basa su GnuPG 2, che, tra le altre cose, include gpg2.exe , che può (finalmente, potrei aggiungere :) avviare gpg-agent.exe su richiesta (non è possibile utilizzare gpg v1.x).

E in secondo luogo, è l'unica build ufficiale di Windows sviluppata dagli sviluppatori di GnuPG. Per esempio. è interamente compilato da Linux a Windows, quindi non è stata utilizzata una iota di software non libero per prepararlo (abbastanza importante per una suite di sicurezza :).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top