2016-06-09 19 views
0

Ich versuche eine Zeichenfolge in Javascript mit RSA (öffentlicher Schlüssel) zu verschlüsseln Und ich möchte diese Zeichenfolge in Python (2.7) mit meinem privaten Schlüssel entschlüsseln.JSEncrypt to PyCrypto RSA-Verschlüsselung nicht möglich

Die Bibliotheken Ich verwende sind JSEncrypt und PyCrypto Das Problem hierbei ist, dass PyCrypto Probleme den verschlüsselten String

Dieser Teil verschlüsselt die Zeichenfolge zu entschlüsseln hat:

var encrypted = new JSEncrypt(); 
encrypted.setPublicKey(key); // key == '-----BEGIN PUBLIC'..... 
encrypted = encrypted.encrypt('test'); 

Die erzeugten verschlüsselten String aussieht wie folgt aus: HJuyZtuUbR4EvjZp0pirbEw0OX8KD7UDNyvSMx3plfzYPjV7r8RBOkouCkvPBG2XOF6E5lPr0ukWClF0u5HB8M6qF8b9xTMnM/j5e41iaPa/oIZyL0JC4h + FZ7cv/P6ygmaSafQ1xc96JltTbuW3u/YYdwmv/01CnFyaIEWW3gk =

012.351.

Dieser Teil soll es entschlüsseln:

private_rsa_key = open('rsa_1024_priv.pem', 'r').read() 
rsa_key = RSA.importKey(private_rsa_key) 
decrypted = rsa_key.decrypt(b64decode(encrypted_string)) 

Das Ergebnis sollte nun ‚Test‘ sein, aber in der Tat ist es: enter image description here

Die richtige Zeichenfolge immer am Ende gesetzt wird, aber ich muß den Teil davor loswerden.

Zu Testzwecken habe ich versucht, den String in Python zu verschlüsseln, mit diesem Code:

public_rsa_key = open('rsa_1024_pub.pem', 'r').read() 
rsa_key = RSA.importKey(public_rsa_key) 
encrypted = rsa_key.encrypt('test', 'x') 

die perfekt erweist sich als 'Test', wenn das Entschlüsseln, aber ganz anders verschlüsselt aussieht:

('\x0bY\x1ckk\x7f\xd6\xda$\x05g\xa0\x0bxI\x0cO9\x8b?>M#X\xd2_[\xb7\xf1\xd0f\xb4\x92C\x01z\xa4\x02q\xb9\xb1\x80\x82\xe8\xe4\\E\x85\xa7r\xff\x1aIL,\xd8\xce\xaf\xef\xb4)\x84\x92]\xabA\xc9+\xd6\xef}\x08\xce\xe8\x97\xf8}\x84(\xb3\x9c\xfe7g\xe0\x869\x8b\xe8\xf8\xdf\x85}\xb0\x87\x1a2\xab\xda\xca\xfd\x81\xc0\x98\x12y\x92\x13\xd6\xa5a\xf3\x9aU\xb5\xa4d\xb8\xfc\xa3\xd1\xe2<\x07\xda\xc3\x9e\xc2',) 

I Ich frage mich, warum dieser verschlüsselte Text jetzt ein Tupel ist, mit Hex darin. Meiner Meinung nach sieht die verschlüsselte Zeichenfolge von JS korrekt aus. Wie kann ich PyCrypto dazu bringen, die Zeichenfolge korrekt zu entschlüsseln?

Vielen Dank im Voraus

Antwort

2

Der Code Python Sie nur das niedrige Niveau Entschlüsselung tut geschrieben, die von der jsencrypt zurück verschlüsselten Daten auch contains pkcs1 padding.

Statt den rohen RSA-Schlüssel verwenden in Ihrem Python-Code zu verschlüsseln/entschlüsseln, müssen Sie die entsprechende cipher, in diesem Fall verwenden PKCS1_v1_5:

... 
from Crypto.Cipher import PKCS1_v1_5 
private_rsa_key = open('rsa_1024_priv.pem', 'r').read() 
rsa_key = RSA.importKey(private_rsa_key) 
cipher = PKCS1_v1_5.new(rsa_key) 
decrypted = cipher.decrypt(encrypted, "ERROR") 

Das gleiche gilt, wenn sie mit dem öffentlichen Schlüssel verschlüsselt werden.

+0

Danke für Ihre Zeit. Ich musste die letzte Zeile ändern in: decrypted = cipher.decrypt (b64decode (verschlüsselt), "ERROR") und es funktioniert jetzt. – DarthVader

+0

Ja, dieses Snippet nimmt an, dass "verschlüsselt" wirklich die rohen verschlüsselten Daten sind, wie sie z. 'cipher.encrypt (b'some message ')'. Ich denke, dass ein solcher Fall im Allgemeinen allgemeiner ist, also werde ich die Antwort so lassen, base64 de/decoding, wenn nötig, ist trivial. – mata

+0

nicht b64decode (verschlüsselter_string) vergessen !! – mouse