python解密在jsencrypt中加密的文本

时间:2016-03-25 15:25:23

标签: javascript python encryption

在网络表单中,答案(以jsonstring打包)分几步加密。首先生成随机密钥。其次,随机密钥用于jsonstring的AES加密。随机密钥也被加密。两者都是通过邮件发送的。

        // 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:info@xyz.com?subject=FORM&body=" + encodeURIComponent(mail_body);
        $('#mailtosend').attr('href', mailto_string);

在收件人邮件服务器端,我想使用pycryptodome软件包使用私钥解密随机生成的密钥和jsonstring。

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)

我遇到了编码问题。 " UnicodeDecodeError:' ascii'编解码器不能解码位置1中的字节0xf7:序数不在范围(128)"编码使问题复杂化,超出了我的能力范围。 我的问题: 1.如何解决编码问题? 2.如何使解密工作?

由于

1 个答案:

答案 0 :(得分:0)

问题很可能是b64decode(text)返回包含str等值的\xf7,然后在.encode()内尝试decrypt这些值造成的。功能。 encode将使用默认编码,在本例中为ascii。我会亲自删除对encode的来电,除非你特别有理由这样做。