likes
comments
collection
share

两端异构情况下,nodejs端RSA加密解密要点

作者站长头像
站长
· 阅读数 40

已有服务器使用的是ASP.net进行RSA加密,新服务器使用koa2,加密后的结果使用nodejs自带的crypto和node-rsa均无法解密,原因未明。试用多个组件后,发现node-jsencrypt的加密解密结果可以通用。故特意记录。

简单的解密流程:

const JSEncrypt = require("node-jsencrypt");
const PUBLICKEY = 
`-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCFSws2t8RQ8IlrXQmkE7lOYQ5h
Xya+HdXrBDh5zGv3+suPEj8K+sLuPfsGCRC6VbyKkzwGECNrzwOPWTx7szHMp4Ou
IRCe8wEyV2TAri7eRukgelXVG4Fh4F1jS14jdWeTfRXFxygkkGTyCvKbWzm9Hp93
fNKDHuB+bTvRS9YMuwIDAQAB
-----END PUBLIC KEY-----`;//公钥
    const rsaEncrypt = `密文`;
    let jsencrypt = new JSEncrypt();
    jsencrypt.setPrivateKey(PRIVATEKEY);
    let decrypt = jsencrypt.decrypt(rsaEncrypt)

字符串长度超过117时,该组件就不能直接解密,如果超长字符串加密,需要进行分割处理长字符串的加密处理:

//分割
    if (querystr.length > 117) {
        let cnt = Number.parseInt(querystr.length / 117) + 1;
        ori_slice.push(querystr.slice(0, len_max))
        for (let i = 1; i < cnt; i++) {
            const _slice = querystr.slice(len_max * i).trim();
            if (_slice.length > 0) {
                ori_slice.push(querystr.slice(len_max * i));
            }
        }
    }
//加密并组合
let encrypt_list = ori_slice.map(i => {
        let jsencrypt = new JSEncrypt();
        jsencrypt.setPublicKey(PUBLICKEY);
        let encrypt = jsencrypt.encrypt(i);
        return encrypt;
    });
    let encrypt_query = encrypt_list.join('::');//以::双冒号划分

解密时,分段解密并拼接即可