Verwenden Sie RSA, um in JavaScript zu verschlüsseln und in Python3 zu entschlüsseln

Ich entwickle eine Website mit diesem JS-Plugin, um einige Daten zu verschlüsseln und an den Server zu senden: https://github.com/travist/jsencrypt

Ich laufe Python 3 mit Django, das Problem ist, ich kann die Daten auf dem Server nicht entschlüsseln. Mein Code ist:

JS-Code:

pkey = "-----BEGIN PUBLIC KEY-----\ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDeVs9mcWUtTgi93/KXMNA/IF7S\ oQcZAmKQueygoDp9XUM3xnxPb/6XNpJQII85Hxbljqs/xuPVtxo5ovyJ+XXIPV8+\ eG6kSDmr2C3NpBUtfoUeADC/1H1jy44T6stBgXGMwTPokhjvSyEbGpkgMGo74Rpq\ q1vHofh3KcPNoaYH4wIDAQAB\ -----END PUBLIC KEY-----"; var encrypter = new JSEncrypt; encrypter.setPublicKey(pkey); encrypter.encrypt('Testing...'); 

Und ich bekomme:

 "STg7Fnm6Y6cAgMXEt4SxP8rbMb/pFB2X9Y1z8pAOoCNO9y8XuhVmQuG/FRBSqM+3ge43x9kfYMideAUu69RothwEOYmNnVrfwqm7SLm3voEcSXCqst2S7prTmCvYW43WyAAUl0vNxV+7xsm/yciQ4XV+jZSKd3xidbWL1BTTUw8=" 

Python-Code:

 from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP from base64 import * def decrypt(key, text): if type(key) == str: key = key.encode() if type(text) == str: text = text.encode() rsakey = RSA.importKey(key) rsakey = PKCS1_OAEP.new(rsakey) d = rsakey.decrypt(text) return d text = "STg7Fnm6Y6cAgMXEt4SxP8rbMb/pFB2X9Y1z8pAOoCNO9y8XuhVmQuG/FRBSqM+3ge43x9kfYMideAUu69RothwEOYmNnVrfwqm7SLm3voEcSXCqst2S7prTmCvYW43WyAAUl0vNxV+7xsm/yciQ4XV+jZSKd3xidbWL1BTTUw8=" text = b64decode(text.encode()) with open('private.pem', 'rb') as f: key = f.read() decrypt(key, text) 

Und ich bekomme:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.2/dist-packages/Crypto/Cipher/PKCS1_OAEP.py", line 227, in decrypt raise ValueError("Incorrect decryption.") ValueError: Incorrect decryption. 

Der private Schlüssel, den ich in diesem Beispiel verwende, ist:

 -----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQCO9YbJ8Z+tW0ucnMdXGNzmcvWaaLRGsx5iUHslbZ1tjec63HDm 6Hr2hv56u5zytyF4Cd/0lBNRC9qf/1XlEFqeSRifsyHZpPfyZn0fbHWYLH8g5FE4 VqrMe79ubSVx2eGWwwaLvEO+yaO1AF/fxWT6Ir8AUikMFFAnX+fBaA3XIwIDAQAB AoGADxuniQP+CgYR8ZUoA+5eugQALLdQBgC7/0veF9CDyKYsf634SI7dH9yYXEQj jAsKgHMatfBIMlJ8YlhLrY+S4+r26goNEqygtqetJ6NuePKQQ8xEERP4icsaBpY7 WqeU6AZOMlyq8o+e4DMnuxGpf8UT+lLx1G9AmVJf3+6NONECQQDLX94BmW//48Y6 yg9wnO6TR1msrGd1PFRqyJ9eilj8chI2JxiHkhepiTlBU7eyjUv4aeE7U84mp3Zo AtPoiKmlAkEAs/OQM9IDttfgdS/yK6vZr1myNAbKOdv1rVId7MAspGHbN//gzb4s r4mZKsIAi+jaDhpMvYbUxJe9y5HAY3XTJwJAe3hcZEQvRv+WHaMG9KuR/EBZJQgW V4qlBZ9/gfokRD9M5yudLNF5JCh3Zj3ZTMGT2eEOKOKcScNpk4QD+yzdMQJAQlSM Gd3WyqXmMav7qwdMVStN2YmLLyqZ80oqh6MKkYkUgh7KYWwxEn84ux8JjojFH5+o G9BASzrXldrivIaozwJAVAHr9ON/altcDyh/OjkJff/3xXzHB3Zxvy4WykkO/PdF tOqpAnYso3mCsEQsCcrJCflkFmJuYsvu4+Tm4GiqVg== -----END RSA PRIVATE KEY----- 

Wenn ich versuche, es auf JS zu entschlüsseln, funktioniert es wie beabsichtigt:

 private = "-----BEGIN RSA PRIVATE KEY-----\ MIICWwIBAAKBgQCO9YbJ8Z+tW0ucnMdXGNzmcvWaaLRGsx5iUHslbZ1tjec63HDm\ 6Hr2hv56u5zytyF4Cd/0lBNRC9qf/1XlEFqeSRifsyHZpPfyZn0fbHWYLH8g5FE4\ VqrMe79ubSVx2eGWwwaLvEO+yaO1AF/fxWT6Ir8AUikMFFAnX+fBaA3XIwIDAQAB\ AoGADxuniQP+CgYR8ZUoA+5eugQALLdQBgC7/0veF9CDyKYsf634SI7dH9yYXEQj\ jAsKgHMatfBIMlJ8YlhLrY+S4+r26goNEqygtqetJ6NuePKQQ8xEERP4icsaBpY7\ WqeU6AZOMlyq8o+e4DMnuxGpf8UT+lLx1G9AmVJf3+6NONECQQDLX94BmW//48Y6\ yg9wnO6TR1msrGd1PFRqyJ9eilj8chI2JxiHkhepiTlBU7eyjUv4aeE7U84mp3Zo\ AtPoiKmlAkEAs/OQM9IDttfgdS/yK6vZr1myNAbKOdv1rVId7MAspGHbN//gzb4s\ r4mZKsIAi+jaDhpMvYbUxJe9y5HAY3XTJwJAe3hcZEQvRv+WHaMG9KuR/EBZJQgW\ V4qlBZ9/gfokRD9M5yudLNF5JCh3Zj3ZTMGT2eEOKOKcScNpk4QD+yzdMQJAQlSM\ Gd3WyqXmMav7qwdMVStN2YmLLyqZ80oqh6MKkYkUgh7KYWwxEn84ux8JjojFH5+o\ G9BASzrXldrivIaozwJAVAHr9ON/altcDyh/OjkJff/3xXzHB3Zxvy4WykkO/PdF\ tOqpAnYso3mCsEQsCcrJCflkFmJuYsvu4+Tm4GiqVg==\ -----END RSA PRIVATE KEY-----\ " text = "STg7Fnm6Y6cAgMXEt4SxP8rbMb/pFB2X9Y1z8pAOoCNO9y8XuhVmQuG/FRBSqM+3ge43x9kfYMideAUu69RothwEOYmNnVrfwqm7SLm3voEcSXCqst2S7prTmCvYW43WyAAUl0vNxV+7xsm/yciQ4XV+jZSKd3xidbWL1BTTUw8=" encrypter.setPrivateKey(private); encrypter.decrypt(text); 

Und ich bekomme:

 "Testing" 

Aber ich kann es einfach nicht machen, auf Python zu arbeiten.

Was mache ich falsch?

3 Solutions collect form web for “Verwenden Sie RSA, um in JavaScript zu verschlüsseln und in Python3 zu entschlüsseln”

Jsencrypt hängt von der jsbn-Bibliothek ab, die OAEP nicht bereitstellt, sondern nur PKCS # 1 v1.5 padding.

Du musst das gleiche in Python verwenden, das PyCrypto zur Verfügung stellt. Verwenden PKCS1_v1_5 einfach PKCS1_v1_5 anstelle von PKCS1_OAEP .


Beachten Sie, dass PKCS # 1 v1.5 Polsterung heute nicht mehr verwendet werden darf. Ich schlage vor, dass Sie die Forge-Bibliothek verwenden, die eine RSA-Implementierung mit OAEP bereitstellt.

Verwenden von PKCS1_v1_5:

 def decrypt(key, text): if type(key) == str: key = key.encode() if type(text) == str: text = text.encode() rsakey = RSA.importKey(key) rsakey = PKCS1_v1_5.new(rsakey) d = rsakey.decrypt(text, 'bollox') return d >>> decrypt(text, key) b'Testing' 

Ich habe mit JSEncrypt JavaScript-Datei, um Konversation zwischen JavaScript und Python mit pycrypto aber bei der Verschlüsselung in JavaScript verwenden, verwendet es eine zufällige Pad in der Funktion pkcs1pad2, die entfernt werden musste und es begann zu arbeiten. Es war ein Hack, aber es hat geklappt. Im Folgenden werden die Zeilen aus der Funktion pkcs1pad2 (s, n) kommentiert

 while(n > 2) { // random non-zero pad x[0] = 0; while(x[0] == 0) rng.nextBytes(x); ba[--n] = x[0]; } ba[--n] = 2; ba[--n] = 0; 
  • Verschlüsseln und Entschlüsseln durch AES-Algorithmus in Python und Android
  • PyCrypto: RSA-Schlüssel mit dem DES3-Passwort erstellen
  • Python AES Entschlüsselungsroutine (Code Hilfe)
  • Sicher verschlüsseln Sie ganzzahlige (bis zu 2 ^ 48) in den kürzesten URL-sicheren String
  • Verschlüsselung / UnEncrypt Python Scripts in C
  • Entschlüsseln von Strings in Python, die mit MCRYPT_RIJNDAEL_256 in PHP verschlüsselt wurden
  • Welcher symmetrische Cypher für die Verschlüsselung von Nachrichten?
  • Vigenere Chiffre - nicht korrekte Werte hinzufügen
  • Python AES Entschlüsselung
  • Python PyCrypto verschlüsselt / entschlüsselt Textdateien mit AES
  • Ist es möglich, einen 100% sicheren virtuellen privaten Server zu haben?
  • Python ist die beste Programmiersprache der Welt.