2016-03-25 7 views
1

In einem Webformular werden die Antworten (in einem String verpackt) in mehreren Schritten verschlüsselt. Zuerst wird ein zufälliger Schlüssel generiert. Zweitens wird der Zufallsschlüssel für die AES-Verschlüsselung der Zeichenfolge verwendet. Der Zufallsschlüssel ist ebenfalls verschlüsselt. Beide werden im Körper einer Post gesendet.Python entschlüsselt einen in jsencrypt verschlüsselten Text

 // Generate Random key 
     var rand_key = ('0000' + Math.random().toString(36).replace('.', '')).substr(-10); 
     console.log('rand_key', rand_key) 
     //var pubkey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALDjeFwFNhMCjMwcRVVKG1VvfsntEVPR3lNTujJnNk1+iSqZ4Tl5Lwq9GbwO+qlYVwXHNmeqG7rkEhL9uyDIZVECAwEAAQ==" 
     // rsa_key_public07012016.bin 
     //var pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCv8FVei4Q2ehmYsSCv/uODSojIOGHwfQe686S1cEH5i/1mGME5ZzNqyy0d+lhMRD0tr7Sje7JoCEC/XRIZaiKJjpl1+3RXotf/Cx3bd9H7WtitshZB1m38ZZFsrX4oigMpUPFbCefMeBS4hvvNnmtl08lQGhfIXdXeflZsgWRHtQIDAQAB"; 
     // my_pub_key.pem 
     var pubkey ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA38gtENP9/hpirSCIsPh6CAVm0UmME4XBlPyK8yhwk079EUJpNzlEhu9HKcA/B7Fxo2lNoY9Tb9e+PYtJ6+VOB4+Y6zgGMX7cchYmumKRTbbQ6FNfBE5Q8XnOAUlgC7gNrs0e5lW7JH1kWlK+eTT4TANT7F3US09aXmym+fZaRInbXmJujGnDIbRIIbzr5FE82EeMpw2TqRWV466wz5EeFWSSQ8EqV1pSox8B1ywb6cnB/Vofs2qR9Zf2efi9TMcSGm/ij/p9IZcbLeep9qfGsv29lbLNMfwNwQyH0JU27eAM4tPdirceZPxfD6iiILmKzN253BMoAeQCp6us53CnGQIDAQAB" 
     // Make form_data a JSON string 
     var jsonstring = JSON.stringify(form_data); 
     // Create AES encrypted object 
     var aes_encrypted_json = CryptoJS.AES.encrypt(jsonstring, rand_key); 
     // Encrypt rand_key 
     var encrypt = new JSEncrypt(); 
     //console.log('encrypt obj', encrypt); 
     encrypt.setPublicKey(pubkey); 
     var encrypted_rand_key = encrypt.encrypt(rand_key); 
     //var encrypted = encrypt.encrypt(jsonstring); 
     console.log('encypted', encrypted_rand_key); 
     var mail_body = encrypted_rand_key + aes_encrypted_json 
     console.log('body', mail_body) 
     var mailto_string = "mailto:[email protected]?subject=FORM&body=" + encodeURIComponent(mail_body); 
     $('#mailtosend').attr('href', mailto_string); 

Auf der Serverseite Empfänger-Mail-ich die zufällig generierte Schlüssel und das jsonstring mit einem privaten Schlüssel des pycryptodome Paket entschlüsseln möge.

from Crypto.PublicKey import RSA 
from Crypto.Cipher import PKCS1_v1_5 
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_v1_5.new(rsakey) 
    d = rsakey.decrypt(text, 'bolloux') 
    return d 

# rand_key am2mhiwwmi 
text = "ZvcrluUmZLY3lRRw01W9mQnhMn7zzpIWn1Bo3csM/ZZ0pWY/8H2dCB9fZDi9/cmp0UtIqDXhLd7SIwyxqrFgPcHUuEHlZl0WQcjSty8PjadG2Abulk1XqEQV4u0Gb/bFGDBMcf5tV1G0d4FFcBPE8r8inrxUjSj2CSffVL8gIGq3ZfY5g7t5FOZV8npBCEONgOLKYnzIiHrHUuXWsOaMAqxMFOLd5DTDLKAkyMybDClsLW9ka+CvWd5fnZBCvO2ziehFp7b9PG4QPSnQpdC8jNLGZB2h0FI8YQD6IyUwmVluUbAlPMqwd6A2CBdGCbfbMChaA5R7bJgKkYhPOQTjaQ==" 
text = b64decode(text.encode()) 

with open('my_priv_key.pem', 'rb') as f: 
    key = f.read() 
decrypt(key, text) 

Ich renne in ein Codierungsproblem. "UnicodeDecodeError: 'ascii' Codec kann Byte 0xf7 nicht an Position 1 dekodieren: Ordnungszahl nicht im Bereich (128)" Die Codierung verkompliziert das Problem über meine Möglichkeiten hinaus. Meine Fragen: 1. Wie kann ich das Codierungsproblem lösen? 2. Wie kann ich die Entschlüsselung funktionieren lassen?

Dank

+0

Fügen Sie den vollständigen Stacktrace hinzu und markieren Sie die entsprechenden Zeilen in Ihrem Code. –

Antwort

0

Das Problem ist mehr als wahrscheinlich verursacht durch b64decode(text) ein str Rückkehr, die Werte wie \xf7 und dann versuchen, .encode() diese Werte in Ihrer decrypt Funktion enthält. encode verwendet die Standardcodierung, die in diesem Fall ascii ist. Ich würde persönlich die Anrufe zu encode entfernen, es sei denn, Sie haben einen Grund, warum Sie dies tun.

Verwandte Themen