Frage

Ich mache ein Programm in Python, das über einen Installateur an Windows -Benutzer verteilt werden soll.

Das Programm muss in der Lage sein, eine Datei jeden Tag herunterzuladen, der mit dem öffentlichen Schlüssel des Benutzers verschlüsselt und dann entschlüsselt wird.

Daher muss ich eine Python -Bibliothek finden, in der ich öffentliche und private PGP -Schlüssel generieren und auch mit dem öffentlichen Schlüssel verschlüsselt werden kann.

Ist das etwas, was Pycrypto tun wird (Dokumentation ist nebulös)? Gibt es andere reine Python -Bibliotheken? Wie wäre es mit einem eigenständigen Befehlszeilen -Tool in einer Sprache?

Alles, was ich bisher gesehen habe, war GNUPG, aber die Installation, dass unter Windows Sachen in die Registrierung geschieht und DLL überall verleiht, und dann muss ich mir Sorgen darüber machen, ob der Benutzer dies bereits installiert hat, wie er seine vorhandenen Keyrings usw. usw. Ich würde lieber lieber usw. machen. Haben Sie einfach eine Python -Bibliothek oder ein Befehlszeilen -Tool und merken Sie die Schlüssel selbst.

Update: Pyme mag funktionieren, aber es scheint nicht mit Python 2.4 kompatibel zu sein, die ich verwenden muss.

War es hilfreich?

Lösung

Du brauchst nicht PyCrypto oder PyMe, In Ordnung, obwohl diese Pakete sein mögen - Sie haben alle möglichen Probleme, unter Windows aufzubauen. Vermeiden Sie stattdessen nicht die Kaninchenlöcher und tun Sie, was ich getan habe? Verwenden gnupg 1.4.9. Sie müssen keine vollständige Installation auf Endbenutzermaschinen durchführen - gerade gpg.exe und iconv.dll Aus der Verteilung reicht aus, und Sie müssen sie nur irgendwo auf dem Pfad haben oder von Ihrem Python -Code mit einem vollständigen Pfadnamen aus zugreifen. Es sind keine Änderungen an der Registrierung erforderlich, und alles (ausführbare Datendateien) können auf einen einzelnen Ordner beschränkt werden, wenn Sie möchten.

Es gibt ein Modul GPG.py Das wurde ursprünglich von Andrew Kuchling geschrieben, von Richard Jones verbessert und von Steve Traugott weiter verbessert. Es ist verfügbar hier, aber so ist es nicht für Windows geeignet, weil es verwendet wird os.fork(). Obwohl ursprünglich Teil von PyCrypto, es ist völlig unabhängig von den anderen Teilen von PyCrypto und benötigt nur gpg.exe/iconv.dll, um zu arbeiten.

Ich habe eine Version (gnupg.py) abgeleitet von Traugotts GPG.py, was das verwendet subprocess Modul. Zumindest für meine Zwecke funktioniert es gut unter Windows - ich benutze es, um Folgendes zu tun:

  • Schlüsselmanagement - Generierung, Auflistung, Export usw.
  • Schlüssel aus einer externen Quelle importieren (z. B. öffentliche Schlüssel, die von einer Partnerfirma erhalten wurden)
  • Daten verschlüsseln und entschlüsseln
  • Signaturen unterschreiben und überprüfen

Das Modul, das ich habe, ist momentan nicht ideal, da es einige andere Dinge enthält, die nicht da sein sollten - was bedeutet, dass ich es im Moment nicht wie möglich nicht veröffentlichen kann. Irgendwann, vielleicht in den nächsten Wochen, hoffe ich, es aufräumen zu können, ein paar weitere Unit -Tests hinzuzufügen (ich habe beispielsweise keine Unit -Tests für Zeichen/Überprüfungen) und veröffentlichen Sie sie (entweder unter entweder unter das Original PyCrypto Lizenz oder eine ähnliche kommerzielle Lizenz). Wenn Sie es kaum erwarten können, gehen Sie mit Traugotts Modul und ändern Sie es selbst - es war nicht zu viel Arbeit, damit es mit dem funktioniert subprocess Modul.

Dieser Ansatz war viel weniger schmerzhaft als die anderen (z. B. SWIG-basierte Lösungen oder Lösungen, die mit dem Gebäude mit dem Gebäude erfordern MinGW/MSYS), mit dem ich berücksichtigte und mit dem ich experimentierte. Ich habe das gleiche benutzt (gpg.exe/iconv.dll) Ansatz mit Systemen in anderen Sprachen, z. B. C#, mit ebenso schmerzlosen Ergebnissen.

PS Es funktioniert mit Python 2.4 sowie Python 2.5 und später. Nicht mit anderen Versionen getestet, obwohl ich keine Probleme vorhersehte.

Andere Tipps

Nach viel Graben fand ich ein Paket, das für mich funktioniert hat. Obwohl es angeblich die Generation von Schlüssel unterstützen soll, habe ich sie nicht getestet. Ich habe es jedoch geschafft, eine Nachricht zu entschlüsseln, die mit einem öffentlichen GPG -Schlüssel verschlüsselt wurde. Der Vorteil dieses Pakets besteht darin, dass keine ausführbare GPG -Datei auf dem Computer erforderlich ist und eine pythonbasierte Implementierung des OpenPGP (anstelle eines Wrappers um die ausführbare Datei) ist. Ich habe die privaten und öffentlichen Schlüssel mit GPG4Win und Kleopatra für Windows erstellt. Siehe meinen Code unten.

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)

Obwohl die Frage sehr alt ist. Ich hoffe, das hilft zukünftiger Benutzer.

Pycrypto unterstützt PGP - obwohl Sie es testen sollten, um sicherzustellen, dass es Ihren Spezifikationen funktioniert.

Obwohl es schwierig ist, eine Dokumentation zu erhalten, können Sie ein rudimentäres Beispiel für ihre PGP -Unterstützung finden:

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

Futhermore, Publickey/Pubkey.Py sieht die folgenden relevanten Methoden vor:

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 Behauptet die volle Kompatibilität mit Python 2.4, und ich zitiere:

Die neueste Version von Pyme (zum Zeitpunkt dieses Schreibens) ist V0.8.0. Die binäre Verteilung für Debian wurde mit Swig V1.3.33 und GCC V4.2.3 für GPGME v1.1.6 und Python v2.3.5, v2.4.4 und v2.5.2 (zur Zeit in der 'instabilen' Verteilung) zusammengestellt. Die Binärverteilung für Windows wurde mit SWIG V1.3.29 und Mingw V4.1 für GPGME V1.1.6 und Python v2.5.2 zusammengestellt (obwohl dieselbe Binärdatei installiert wird und auch in V2.4.2 gut funktioniert).

Ich bin mir nicht sicher, warum Sie sagen "Es scheint nicht mit Python 2.4 kompatibel zu sein, was ich verwenden muss" - Einzelheiten bitte?

Und ja, es existiert als semi-pythonische (SWIGD) Wrapper auf GPGME-das ist eine beliebte Möglichkeit, Python-Erweiterungen zu entwickeln, sobald Sie eine C-Bibliothek haben, die im Grunde den Job macht.

Pypgp hat einen viel einfacheren Ansatz-deshalb ist es ein einzelnes, einfaches Python-Skript: Grundsätzlich tut es nichts weiter als "Shell aus" für Befehle der Befehlszeile. Zum Beispiel ist die Entschlüsselung nur:

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

dh den verschlüsselten CypherText in die Standardeingabe von schreiben pgpv -f, Lesen Sie die Standardausgabe von PGPV als entschlüsselter Klartext.

PYPGP ist auch ein sehr altes Projekt, obwohl seine Einfachheit bedeutet, dass es nicht schwierig wäre, es mit modernem Python (z. B. Subprozess anstelle von jetzt mundemerikanischem OS.Popen2) zu arbeiten. Aber du brauchst immer noch PGP installiert oder pypgp wird nichts tun ;-).

M2Crypto Hat ein PGP -Modul, aber ich habe eigentlich nie versucht, es zu verwenden. Wenn Sie es versuchen und es funktioniert, lassen Sie es mich bitte wissen (ich bin der aktuelle M2Crypto -Betreuer). Einige Links:

Aktualisieren: Das PGP -Modul bietet keine Möglichkeiten zum Generieren von Schlüssel, aber vermutlich können diese mit der unteren Ebene erstellt werden RSA, DSA usw. Module. Ich kenne PGP -Innenseiten nicht, also müssten Sie die Details ausgraben. Wenn Sie wissen, wie Sie diese mit OpenSSL -Befehlszeilenbefehlen generieren, sollte es einigermaßen einfach sein, dies in M2Crypto -Anrufe umzuwandeln.

Wie andere bemerkt haben, ist Pyme die kanonische Lösung dafür, da es auf GPGME basiert, das Teil des GNUPG -Ökosystems ist.

Für Windows empfehle ich dringend, zu verwenden Gpg4win Als GNUPG -Verteilung aus zwei Gründen:

Es basiert auf GNUPG 2, was unter anderem beinhaltet gpg2.exe, was kann (endlich, könnte ich hinzufügen :) Starten Sie gpg-agent.exe On-Demand (gpg v1.x kann nicht).

Und zweitens ist es die einzigen offiziellen Fenster, die von den GNUPG -Entwicklern erstellt wurden. ZB es ist vollständig von Linux zu Windows kompiliert, so dass bei der Vorbereitung kein IoTA von nicht freier Software verwendet wurde (für eine Sicherheitssuite sehr wichtig :).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top