python解密在jsencrypt中加密的文本

python decrypt a text encrypted in jsencrypt

本文关键字:加密 文本 jsencrypt 解密 python      更新时间:2023-09-26

在web表单中,答案(封装在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.如何进行解密?

感谢

问题很可能是由b64decode(text)返回包含值(如'xf7)的str,然后尝试在decrypt函数中.encode()这些值引起的。encode将使用默认编码,在这种情况下为ascii。我个人会删除对encode的调用,除非您有明确的原因。