Question

Je crée un programme en Python qui sera distribué aux utilisateurs de Windows via un programme d'installation.

Le programme doit pouvoir télécharger chaque jour un fichier chiffré avec la clé publique de l'utilisateur, puis le déchiffrer.

Il me faut donc trouver une bibliothèque Python qui me permette de générer des clés PGP publiques et privées et de décrypter des fichiers chiffrés avec la clé publique.

Est-ce quelque chose que pyCrypto fera (la documentation est nébuleuse)? Existe-t-il d'autres bibliothèques Python pures? Que diriez-vous d’un outil de ligne de commande autonome dans n’importe quelle langue?

Tout ce que j’ai vu jusqu’à présent, c’était GNUPG, mais l’installer sur Windows modifie le registre et jette les dll partout, puis je dois me demander si les utilisateurs l’ont déjà installé, comment sauvegarder leurs trousseaux de clés existants, etc. I préférez simplement disposer d'une bibliothèque python ou d'un outil de ligne de commande et gérer les clés moi-même.

Mise à jour: pyME pourrait fonctionner mais il ne semble pas être compatible avec Python 2.4 que je dois utiliser.

Était-ce utile?

La solution

Vous n'avez pas besoin de PyCrypto ou de PyMe , bien que ces packages soient, vous aurez toutes sortes de problèmes à générer sous Windows. Au lieu de cela, pourquoi ne pas éviter les trous de lapin et faire ce que j'ai fait? Utilisez gnupg 1.4.9 . Vous n'avez pas besoin de faire une installation complète sur les ordinateurs des utilisateurs finaux - il suffit de gpg.exe et de iconv.dll de la distribution, ils suffisent. les quelque part dans le chemin ou accessible depuis votre code Python en utilisant un chemin complet. Aucune modification du registre n'est nécessaire et tout (les fichiers exécutables et les fichiers de données) peut être limité à un seul dossier si vous le souhaitez.

Il existe un module GPG.py qui a été écrit à l'origine par Andrew Kuchling, amélioré par Richard Jones et amélioré par Steve Traugott. Il est disponible ici , mais tel quel ne convient pas pour Windows car il utilise os.fork () . Bien qu’à l’origine, il fasse partie de PyCrypto , il est complètement indépendant des autres parties de PyCrypto et ne nécessite que gpg.exe / iconv.dll pour fonctionner .

J'ai une version ( gnupg.py ) dérivée du GPG.py de Traugott, qui utilise le module de sous-processus . Cela fonctionne bien sous Windows, du moins pour mes besoins - je l’utilise pour effectuer les opérations suivantes:

  • Gestion des clés - génération, liste, exportation, etc.
  • Importer des clés depuis une source externe (par exemple, des clés publiques reçues d'une société partenaire)
  • Crypter et décrypter des données
  • Signer et vérifier les signatures

Le module que j’ai reçu n’est pas idéal à montrer pour l’instant, car il contient d’autres éléments qui ne devraient pas être présents - ce qui signifie que je ne peux pas le publier tel quel pour le moment. A un moment donné, peut-être dans les deux prochaines semaines, j'espère pouvoir le ranger, ajouter quelques tests unitaires supplémentaires (par exemple, je n'ai pas de tests unitaires pour signer / vérifier) ??et le publier (sous licence PyCrypto originale ou une licence similaire compatible avec les conditions commerciales). Si vous ne pouvez pas attendre, utilisez le module de Traugott et modifiez-le vous-même. Cela n'a pas été un travail fastidieux de le faire fonctionner avec le module subprocess .

Cette approche était beaucoup moins pénible que les autres (solutions basées sur SWIG , par exemple, ou nécessitant une construction avec MinGW / MSYS ), que j’ai considéré et expérimenté. J'ai utilisé la même approche ( gpg.exe / iconv.dll ) avec des systèmes écrits dans d'autres langues, par exemple. C # , avec des résultats également simples.

P.S. Cela fonctionne avec Python 2.4 ainsi que Python 2.5 et versions ultérieures. Non testé avec d'autres versions, bien que je ne prévois aucun problème.

Autres conseils

Après beaucoup de recherches, j’ai trouvé un colis qui me convenait parfaitement. Bien qu'il soit dit de supporter la génération de clés, je ne l'ai pas testé. Cependant, j'ai réussi à déchiffrer un message chiffré à l'aide d'une clé publique GPG. L'avantage de ce paquet est qu'il ne nécessite pas de fichier exécutable GPG sur la machine et constitue une implémentation d'OpenPGP basée sur Python (plutôt qu'un encapsuleur autour de l'exécutable). J'ai créé les clés privées et publiques avec GPG4win et kleopatra pour Windows Voir mon code ci-dessous.

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)

Bien que la question soit très ancienne. J'espère que cela aidera les futurs utilisateurs.

PyCrypto prend en charge PGP - vous devez toutefois le tester pour vous assurer qu'il fonctionne conformément à vos spécifications.

Bien que la documentation soit difficile à trouver, si vous parcourez Util / test.py (le script de test du module), vous pouvez trouver un exemple rudimentaire de leur prise en charge 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

De plus, PublicKey / pubkey.py fournit les méthodes pertinentes suivantes:

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 revendique une compatibilité totale avec Python 2.4, et je cite:

  

La dernière version de PyMe (à partir de cette version)   écrit) est v0.8.0. Son binaire   la distribution pour Debian a été compilée   avec SWIG v1.3.33 et GCC v4.2.3 pour   GPGME v1.1.6 et Python v2.3.5,   v2.4.4 et v2.5.2 (fournies dans   distribution "instable" à l'époque).   Sa distribution binaire pour Windows   a été compilé avec SWIG v1.3.29 et   MinGW v4.1 pour GPGME v1.1.6 et Python   v2.5.2 (bien que le même binaire get   installé et fonctionne bien dans la v2.4.2   bien).

Je ne vois pas trop pourquoi vous dites "cela ne semble pas compatible avec Python 2.4, que je dois utiliser" - spécificités s'il vous plaît?

Et oui, il existe en tant qu’encapsuleur semi-Pythonic (SWIGd) sur GPGME - c’est un moyen populaire de développer des extensions Python une fois que vous avez une bibliothèque C qui fait essentiellement le travail.

PyPgp a une approche beaucoup plus simple - c'est pourquoi il est un seul et simple script Python: en gros, il ne fait rien d'autre que "shell out". aux commandes PGP en ligne de commande. Par exemple, le déchiffrement est simplement:

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

c.-à-d., écrivez le texte chiffré chiffré sur l'entrée standard de pgpv -f , lisez la sortie standard de pgpv sous forme de texte en clair déchiffré.

PyPgp est également un projet très ancien, bien que sa simplicité permette de le faire fonctionner avec Python moderne (par exemple, un sous-processus au lieu d'un os.popen2 maintenant obsolète) ne serait pas difficile. Cependant, vous devez toujours installer PGP , sinon PyPgp ne fera rien; -).

M2Crypto possède le module PGP, mais je n'ai jamais essayé de l'utiliser. Si vous l'essayez, et que cela fonctionne, faites-le moi savoir (je suis le responsable actuel de M2Crypto). Quelques liens:

Mise à jour: Le module PGP ne permet pas de générer des clés, mais celles-ci pourraient probablement être créées avec le niveau inférieur RSA , DSA , etc. modules. Je ne connais pas PGP à l'intérieur, vous devez donc déterrer les détails. De plus, si vous savez comment générer ces commandes à l’aide de commandes de ligne de commande openssl, il devrait être relativement facile de les convertir en appels M2Crypto.

Comme d'autres l'ont noté, PyMe est la solution canonique à cet égard, car il est basé sur GpgME, qui fait partie de l'écosystème GnuPG.

Pour Windows, il est vivement recommandé d’utiliser Gpg4win comme distribution GnuPG, pour deux raisons:

Il est basé sur GnuPG 2, qui inclut, entre autres, gpg2.exe , qui peut (enfin, je pourrais ajouter :) démarrer gpg-agent.exe à la demande (gpg v1.x ne peut pas).

Et deuxièmement, c’est la seule version officielle de Windows par les développeurs GnuPG. Par exemple. il est entièrement compilé de Linux à Windows, de sorte que pas moins de iota de logiciel non libre n’a été utilisé pour le préparer (très important pour une suite de sécurité:).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top