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!
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