2017-12-13 4 views
3

Hallo, ich programmiere gerade eine Anwendung in Python mit Pyzmq für die Kommunikation zwischen einem PC-Client und einem Himbeer-Server. Ich brauche den PC-Client, um ein verschlüsseltes Passwort an den Himbeer-Dienst zu senden. Ich werde nur die RSA-Teile meines Codes veröffentlichen, also wenn Sie mehr Informationen oder andere Teile meines Programms benötigen, bitte sagen Sie mir.Python Warum habe ich Sonderzeichen in RSA-Verschlüsselung

Also auf meiner Himbeere mache ich den einen RSA-Schlüssel zu generieren:

from Crypto.Hash import MD5 
from Crypto.PublicKey import RSA 
from Crypto.Util import randpool 

alea = randpool.RandomPool() 
RSAKey = RSA.generate(1024,alea.get_bytes) 

Dann bekomme ich n und e Parameter dieses RSAkey, die an dem Public Key entsprechen sie zu meinem PC-Client zu senden.

Wenn mein PC diese Informationen aus dem Raspberry erhalten, konstruieren i des öffentlichen Schlüssels auf dem Client:

from Crypto.Hash import MD5 
from Crypto.PublicKey import RSA 

def create_public_key(n,e): 
    key_params = (long(n),long(e)) 
    return RSA.construct(key_params) 

Dann, wenn der Benutzer sein Passwort eingibt, möchte ich es verschlüsseln:

def encrypt(text): 
    crypted = Client_Public_Key.encrypt(text,32) 
    return crypted[0] 

Hier wird die crypted ich für den Text bekommen "12345":

('C?\xd2\xca7j\xa0\x0cw\x8b+R"\xc37\xe8IR\xa1\x9fu\xe7v\x0c\xcaW-\xfcXb;]\x887\xc9\xfd\xf6\x0f\xe7\xae\x08\xfe\x0b\xaa*\xfa\x1b\x95:c\x99\xcb\xc6\x9f\x1d\xe1\x84\xa6\xcb\x8adh\x97w\xacR\xff\x8c\x80\xedX\xcc\xf3\xc3\x99\x99\xe9\x92\x8e\xbf]>5\xc5\xbe\x0e*G\xe2\xf2m\xdeN\xa4\x19\xbf\xd6\xd6\x9c\xba\xf9\xc8f\xa7_\xef\x84q\x877\x90\xd3\xd5\x93\xef\x81\xfc $\x9e\x03\t\x9c\xb4\xb1D,Q',) 

ich versuchte abweichen entschlüsseln (wie zB Cipher's PKCS1_OAEP) und bekomme immer diese komischen Strings. Warum bekomme ich keine normale Zahlenfolge?

Ich möchte weiterhin die Entschlüsselungsfunktion dieser Bibliothek verwenden, weil es sehr schnell ist, aber die Verschlüsselungsfunktion nervt mich ständig.

Was kann ich tun? Vielen Dank !

Auf meinem PC benutze ich Spyder mit Python 2.7.14. Auf meinem Raspberry verwende ich Python 3.5.x.

+0

Ich werde nur auf Zaphs ausgezeichnete Antwort erweitern: Denken Sie daran, dass das * Zeichen * '\ xd2' das * Byte * 0xd2 darstellt. Also, was Sie sehen, ist das Byte-Array, das aus RSA kommt, das in eine Schnur gefüllt wird. (Drucken Sie das zufällig als 'str (encrypt (text))'? [Dieser Artikel] (https://stackoverflow.com/questions/19210414/byte-array-to-hex-string) gibt eine Methode zum Konvertieren an das Bytearray zu einer hexadezimalen Zeichenkette, vorausgesetzt, dass die Ausgabe von 'encrypt' wirklich ein Bytearray ist. – lockcmpxchg8b

Antwort

4

Moderne Chiffren arbeiten mit Bytes, nicht mit Zeichen, sowohl für den Eingang als auch für den Ausgang. Manchmal werden die Zeichen implizit als Bytes codiert - normalerweise ASCII oder ASCII kompatibel wie Windows-1252 (erweitertes Latein).

Der Chiffretext ist jedoch (fast) nicht von zufällig zu unterscheiden, was bedeutet, dass wenn Sie das Ergebnis als Zeichen betrachten, Sie "Müll" bekommen, da die Ausgabe nicht druckbare Zeichen enthält. Sie hatten Glück, dass Sie anstelle von Unicode mit chinesischen Zeichen eine hexadezimale Darstellung dieser Bytewerte erhalten haben.

Um Text zu erhalten, sollten Sie in Base 64 oder Hexadezimalzahlen konvertieren (mehr "lesbar", weniger effizient).

RSA - die Berechnung - selbst erzeugt eine Nummer während der Verschlüsselung: das Ergebnis der modularen Potenzierung mit dem öffentlichen Exponenten. Der RSA-Standard (PKCS # 1) konvertiert diese Zahl jedoch in eine Byte-Array fester Länge mit der gleichen Größe des Moduls (das heißt: die Schlüsselgröße in Bytes) in einer Funktion namens I2OSP (Ganzzahl zu Oktett-String-Primitiv). Es ist in nicht signierter Big-Endian-Darstellung, um genau zu sein.

+0

Vielen Dank, ich habe die verschlüsselte Nachricht in base64 konvertiert und es funktioniert jetzt, ich könnte es an meine Himbeere senden. weniger effizient ", Sie meinen, es ist weit weniger sicher? – Elweiss

+1

Kein Hex ist weniger effizient, weil es 2 Zeichen pro Byte statt 4 für alle 3 verwendet. Es ermöglicht Ihnen jedoch auch, die Größe in Bytes einfacher zu sehen, nur durch zwei teilen . –

3

Die Verschlüsselung basiert auf Bytes und viele Bytewerte haben in einer bestimmten Zeichenkodierung kein entsprechendes Zeichen (oder Glyph). Einige Sprachen zeigen hexadezimal wie \x0c an, andere zeigen andere Glyphen wie z. B. , es gibt keinen Standard für die Darstellung von nicht darstellbaren Binärcodes.

Als Beispiel fro die Frage \x0c hex ist für die Nummer 12. Der \x Teil gibt die folgenden zwei Zeichen als hexadezimale zu interpretieren sind

Wenn eine Zeichendarstellung benötigt wird, dann werden die üblichen Kodierungen Base64 zu verwenden sind und hexadezimal.

Nehmen Sie sich etwas Zeit, um Zeichenkodierungen zu untersuchen, beginnen Sie mit ASCII und dann utf-8, dieses Verständnis wird Ihnen im Laufe der Zeit gut tun.