懂你说的了。这不是 rsa 的问题,而是 node-jsencrypt 这个库的问题,这玩意最后一版都 7 年前了。它并没有完全实现 rsa
出现这个问题的原因是你写了如下代码
//使用公钥
encrypt.setPublicKey(pub_key);
//使用私钥
encrypt.setPrivateKey(pub_key);
其结果是将 pub_key 和 pub_key 当成了一对。即使它们并不是通过 openssl 生成的一对。
使用如下代码
const JSEncrypt = require('node-jsencrypt');
// 创建RSA加密对象
const encrypt = new JSEncrypt();
// 公钥(你给的第一个公钥)
const pub_key =
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyFMjUfalWn/hx4n+acT1D8lYUW/3V068a4swOBiQfSQbWNx8kX1K6vq1klB1QiT3ZealVH3eO22X5l3jCMuUO7sr0xPbEztclB84Dzq4NX4wlwgcjHFvhdjL0jWEyVmLPyDTMpTTguz5fAmJaT+E85/rWDdK4UjSRRPX+om3EzFObQc1OpqzxV1fv5XMgNhpz7AxBkgMEiIDKKSPi1Wc1Zw7P3zqI3YsKppz5XK3un8gitWBZ3gJ2xdCvRAibH2RCp9KBFnAk8U4qB/fYS+fHhp1fO//JFYLo2xS4FVAcQCPMUFkyjWq32CjNkExBVhWcq5uXmwrruZDDoayTmq7EQIDAQAB';
const data = '神奇';
//使用公钥
encrypt.setPublicKey(pub_key);
const res = encrypt.encrypt(data);
console.log('加密结果');
console.log(res);
得到一个加密后的 res
然后再
const JSEncrypt = require('node-jsencrypt');
// 创建RSA加密对象
const encrypt = new JSEncrypt();
// 私钥(将你的第一个或者第二个私钥)
const pri_key = 'xxxxxxxxxxxxxx';
//使用公钥
encrypt.setPublicKey(pub_key);
const res = encrypt.decrypt(`之前的结果`);
console.log('解密结果:');
console.log(res);
你就能发现,密钥真的需要配对才行(狗头)
最后,并不建议使用 node-jsencrypt 这个老掉牙的
在 node 中可以直接使用以下代码(新版本可能需要node --security-revert=CVE-2023-46809 index.js 加上安全忽略标志)
或者第三方库直接用 jsencrypt(node-jsencrypt 就是用的这个的老版本)。
const { publicEncrypt, constants, privateDecrypt } = require('crypto');
function rsaEncrypt(publicKey, text) {
return publicEncrypt(
{
key: `-----BEGIN PUBLIC KEY-----\n${publicKey}\n-----END PUBLIC KEY-----`,
padding: constants.RSA_PKCS1_PADDING,
},
Buffer.from(text, 'utf8')
).toString('base64');
}
function rsaDecrypt(privateKey, text) {
return privateDecrypt(
{
key: `-----BEGIN RSA PRIVATE KEY-----\n${privateKey}\n-----END RSA PRIVATE KEY-----`,
padding: constants.RSA_PKCS1_PADDING,
},
Buffer.from(text, 'base64')
).toString('utf8');
}
// 公钥
const pub_key =
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyFMjUfalWn/hx4n+acT1D8lYUW/3V068a4swOBiQfSQbWNx8kX1K6vq1klB1QiT3ZealVH3eO22X5l3jCMuUO7sr0xPbEztclB84Dzq4NX4wlwgcjHFvhdjL0jWEyVmLPyDTMpTTguz5fAmJaT+E85/rWDdK4UjSRRPX+om3EzFObQc1OpqzxV1fv5XMgNhpz7AxBkgMEiIDKKSPi1Wc1Zw7P3zqI3YsKppz5XK3un8gitWBZ3gJ2xdCvRAibH2RCp9KBFnAk8U4qB/fYS+fHhp1fO//JFYLo2xS4FVAcQCPMUFkyjWq32CjNkExBVhWcq5uXmwrruZDDoayTmq7EQIDAQAB';
// 私钥
const pri_key =
'MIIEogIBAAKCAQEAyFMjUfalWn/hx4n+acT1D8lYUW/3V068a4swOBiQfSQbWNx8kX1K6vq1klB1QiT3ZealVH3eO22X5l3jCMuUO7sr0xPbEztclB84Dzq4NX4wlwgcjHFvhdjL0jWEyVmLPyDTMpTTguz5fAmJaT+E85/rWDdK4UjSRRPX+om3EzFObQc1OpqzxV1fv5XMgNhpz7AxBkgMEiIDKKSPi1Wc1Zw7P3zqI3YsKppz5XK3un8gitWBZ3gJ2xdCvRAibH2RCp9KBFnAk8U4qB/fYS+fHhp1fO//JFYLo2xS4FVAcQCPMUFkyjWq32CjNkExBVhWcq5uXmwrruZDDoayTmq7EQIDAQABAoIBAATpW5YrX3OAFizlGmqadyMLczxlQTcP9E5eC8Zxp71Bu4qVYVfUhBfjIhIzzHmHhtSl7+DJ8z8Zbp4p0s1ePG9YeqMYELOAgu0TdOA+ttHXmwu2RF5B0ROtiesd/82grJQq0wghnlaj8Rv+7zJi6c4VWi5VW2MkUholJJL9JGghLrjMcdflqM36XN6e9kESVOJrN8IPbEfH03JRgiEBj7aMpKbxizYTvXYOkFUqUkKgOdB+tZAnYGDRkLNOQhPcl+RChHqiwn7NI3XyhQpHc0UWv4sUe2yi18CxzTv5wR51eovq43nkYCPkLjA2GeH36fZHy1//BQwlQfdlpU/Ls08CgYEA0+FQJuG3Z4vvS0wGbEz9zgah7POVEinDqwtEdZ60CJhjotXJfeUz5CVkUm2CrpMp6URT1z+/WE+q4vIrQYpCwRQk6JR720W0Ko1cs8xipAvniq1jiipPEwXojqSTY/2N5JpRssHeS79HLSwQyjdUpQpkaYp0xdrgwr/a7r2vwSMCgYEA8gnX06L4ln+cM1yr4yhsIJ41go/KDMEvfp7bNejAKPkOIZK/X6oL3hrtlAkvnbpBGRovck8VQMuBX/IleX4mWj/AwwW4znWcEqGn9IPqE0gLyIE2ZanEa3qP3A+FdsVm+2hfSggnChzIRmulg1ajBg4FMdDnKrG+56DBelBxaDsCgYB4t2duL63J3g1hThheveLg7iB1mzY0mfz0R8Aib2BNgV1LGhjplJvjAXbOC7yn8Aqx748BFT3Ud9d549XHSpnL3clFhcunW2hR0iad/fW5V1r9RNpwjrhsszITiyq6jmy4cT/Y4+HeMEXCM9gBDlM4kNoy04LCc3kZHCwFV6d6FwKBgC7ZAuJe3/jZWFWEsWx1bYBevwK3bCdN2TCL9OgZVeBYXIjZC5uroUJrOeL2aDYCUAlYzSg18GorOa5lgyVh6nB7eIcG+39SulPM4GJuigcTYdx8ThgdZPxcq62vf2i+yrEMwazlqRDHA2jF+zJRuZo5an367lOQNeBFeE2BdoHzAoGACkqOsBKDMvX6sObd0j/Hwx2AVePfJqbIEQNH/kncKKdI1i1hjDTgZ4VV5q+PzpaFOc0LkZCpXhopqHQ7O7qMmE79fPdllCam1E1kRjN0M9YX5/WeaxKFh9wMG1VOfQg3MoLPbM8afI5hdvqvc70nMH/tyu4hpKyFyeFEmOLoSoY=';
const data = '神奇';
const res = rsaEncrypt(pub_key, data);
console.log('加密结果:');
console.log(res);
console.log('解密结果:');
console.log(rsaDecrypt(pri_key, res));
|