2012-03-27 9 views
3

Hallo an alle. es funktioniertPyCrypto: Entschlüsseln Sie nur mit dem öffentlichen Schlüssel in der Datei (kein privater + öffentlicher Schlüssel)

Ich versuche, ein wenig mit RSA öffentlichen und privaten Schlüsseln und Verschlüsselung/Entschlüsselung mit PyCrypto und mir begegnet ist zu spielen und Thema, das mir irgendwie seltsam scheint (es wahrscheinlich sehr viel Sinn die Art und Weise macht jetzt, aber ich weiß nicht viel über RSA asymmetrische Verschlüsselung und deshalb ist es verwirrend mich). Es ist die Unfähigkeit, die ich getroffen habe, um etwas zu entschlüsseln, das nur den öffentlichen Schlüssel hat.

Hier ist die Sache: Ich habe einen Server und einen Client. Ich möchte, dass der Server den Client "erkennt" und den Client registriert und in einer Liste von "bekannten Geräten" anzeigt. Der Client verfügt über den öffentlichen Schlüssel des Servers, und der Server verfügt über den öffentlichen Schlüssel des Clients. Wenn der Client mit dem Server kommuniziert, verschlüsselt er seine Daten mit dem privaten Schlüssel des Clients und mit dem öffentlichen Schlüssel des Servers. Auf diese Weise kann nur der richtige Server die Daten (mit seinem privaten Schlüssel) öffnen und wird in der Lage sein, zu verifizieren, dass der Absender tatsächlich der Client ist, der behauptet, dass ... nun ... oder zumindest, das ist was ich denke, weil ich ziemlich Neuling in dieser asymmetrischen Verschlüsselung bin. Die Idee ist, dass, wenn einer dieser Clients aufwacht, er seinen öffentlichen Schlüssel sendet (natürlich verschlüsselt mit dem öffentlichen Schlüssel des Servers, aber das ist wahrscheinlich zu diesem Zeitpunkt noch nicht relevant ...) und sagt: "Hey, ich bin ein neuer Client, und dies ist mein öffentlicher Schlüssel. Registrieren Sie diesen Schlüssel mit meiner UUID "und der Server wird gehorchen, diesen öffentlichen Schlüssel der UUID des Clients zuordnen und diesen Schlüssel verwenden, um Daten zu entschlüsseln, die von diesem Client kommen. Ich will nur die Client-öffentliche Schlüssel übertragen, seinen privaten Schlüssel geheim zu halten, Geheimnis, Geheimnis (es ist privat, nicht wahr?)

ich einige Tests mit openssl mache und sehr einfachen Python-Skripte, die PyCrypto (tatsächlich nutzen, nicht einmal in einer Server/Client-Architektur oder irgendetwas ... nur versuchen, etwas mit einem privaten Schlüssel zu verschlüsseln und es mit dem öffentlichen Schlüssel zu entschlüsseln)

Zuerst habe ich einen öffentlichen/privaten Schlüssel erstellt mit:

openssl genrsa -out ~/myTestKey.pem -passout pass:"f00bar" -des3 2048 

Ok, erste Sache, die mich ein bisschen verwirrt ... Es erzeugt nur eine fi le, sowohl mit dem privaten als auch mit dem öffentlichen Schlüssel ... Nun ... Oha ... was auch immer. Ich kann mit dem öffentlichen Schlüssel extrahieren:

openssl rsa -pubout -in ~/myTestKey.pem -passin pass:"f00bar" -out ~/myTestKey.pub 

Also dachte ich, ich meine paar Privat hatte (privaten und öffentlichen, eigentlich) und öffentlichen Schlüsseln in ~/myTestKey.pem und ~/myTestKey.pub sind. Nun ... anscheinend mache ich etwas falsch, weil PyCrypto diese Baugruppe nicht mag. Und ich weiß nicht warum.

Ich habe zwei sehr einfache Testskripte, "encryptor.py" und "decryptor.py". Das "encryptor.py" sollte etwas mit dem privaten Schlüssel verschlüsseln und "decryptor.py" mit dem öffentlichen Schlüssel entschlüsseln. Ich weiß ... Ich bin ein parangon Originalität ...

Also, ich die Zeichenfolge "Loren ipsum" mit meinem "encryptor.py" verschlüsseln (mit einem privaten Schlüssel):

---- ------- encryptor.py ----------------

#!/usr/bin/python 

from Crypto.PublicKey import RSA 

def encrypt(message): 
    externKey="/home/borrajax/myTestKey.pem" 
    privatekey = open(externKey, "r") 
    encryptor = RSA.importKey(privatekey, passphrase="f00bar") 
    encriptedData=encryptor.encrypt(message, 0) 
    file = open("/tmp/cryptThingy.txt", "wb") 
    file.write(encriptedData[0]) 
    file.close() 

if __name__ == "__main__": 
    encryptedThingy=encrypt("Loren ipsum") 

Und es funktioniert gut. Gut...Ich nehme an, denn in der Datei "/tmp/cryptThingy.txt" bekomme ich viel Kauderwelsch. Es sieht wirklich, wirklich verschlüsselt für mich aus.

Aber wenn ich versuche es einfach die Datei zu entschlüsseln, verwenden, die nur den öffentlichen Schlüssel enthält ...

----------- decryptor.py -------- -------

#!/usr/bin/python 

from Crypto.PublicKey import RSA 

def decrypt(): 
    externKey="/home/borrajax/myTestKey.pub" 
    publickey = open(externKey, "r") 
    decryptor = RSA.importKey(publickey, passphrase="f00bar") 
    retval=None 

    file = open("/tmp/cryptThingy.txt", "rb") 
    retval = decryptor.decrypt(file.read()) 
    file.close() 
    return retval 


if __name__ == "__main__": 
    decryptedThingy=decrypt() 
    print "Decrypted: %s" % decryptedThingy 

... PyCrypto schreit mit einem an mich:

File "/usr/local/lib/python2.7/dist-packages/pycrypto-2.5-py2.7-linux-i686.egg/Crypto/PublicKey/RSA.py", line 107, in _decrypt 
    mp = self.key._decrypt(cp) 
TypeError: Private key not available in this object 

Ja, es ist natürlich Nicht verfügbar! Ich habe den öffentlichen Schlüssel extrahiert! Es dauerte 2 Stunden, bis ich herausgefunden hatte, wie man es richtig macht !!

Was fehlt mir? Wie gesagt, ich bin ziemlich Neuling in dieser öffentlichen/privaten asymmetrischen Schlüsselverschlüsselung, so dass ich einen Kern "konzeptionellen Fehler" haben könnte ... Jeder Hinweis wird geschätzt.

¡Vielen Dank im Voraus!

+3

Nur ein Tipp: Verwenden Sie das Modul 'Cipher.PKCS1_OAEP' zum Verschlüsseln/Entschlüsseln. Es wird eine sichere Auffüllung auf Ihre Nachricht anwenden. Verwenden Sie nicht die Methode zum Verschlüsseln/Entschlüsseln des RSA-Schlüssels. Siehe hier: https://www.dlitz.net/software/pycrypto/api/current/Crypto.Cipher.PKCS1_OAEP-module.html – SquareRootOfTwentyThree

Antwort

2

Sie haben es falsch herum, Sie verschlüsseln mit dem öffentlichen Schlüssel und entschlüsseln mit dem privaten Schlüssel.

Die öffentlich zugänglichen Verschlüsselungsschlüssel ist weit verbreitet, während der private Entschlüsselungs-Schlüssel nur dem Empfänger bekannt ist. Nachrichten werden mit dem öffentlichen Schlüssel des Empfängers verschlüsselt und können nur mit dem entsprechenden privaten Schlüssel entschlüsselt werden. Source

Die Idee ist, dass Sie die Sendeseite den öffentlichen Schlüssel geben (was jemand haben kann, so dass Sie es in der offenen verteilen können) dann die Daten damit verschlüsseln, entschlüsseln sie dann auf dem Ende mit Ihr privater Schlüssel (den Sie nur haben). Auf diese Weise bleiben die Daten sicher. Sie können etwas mit dem privaten Schlüssel verschlüsseln, da der private Schlüssel die Informationen enthält, die zum Erstellen des öffentlichen Schlüssels erforderlich sind, aber es wäre ungewöhnlich, dies zu tun, da die Person, die die Daten verschlüsselt, normalerweise den privaten Schlüssel besitzt .

+0

'Du hast es falsch herum ', Yeeep ... Ich wusste es: - D Dank – BorrajaX

+0

@BorrajaX Keine Sorge, wenn es Ihre Frage beantwortet, fühlen sie sich frei zu [akzeptieren] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235# 5235). –

+0

Können Sie erklären, was Sie tun wollen, was das OP tun möchte? – Helio

Verwandte Themen