我正在集成第三方API服务,为了安全起见,他们要求我们以加密格式交换信息。因此,他们要求我创建一个RSA公钥/私钥并与他们共享公钥。
这就是他们告诉我要做的
公开密钥证书(4096位)。用于加密和解密。 (Zip文件)或公钥要求具有自签名证书(4096位格式)。证书格式应为X.509证书,以“开始证书”开头,以“结束证书”结尾
所以,我运行了以下命令,并给了他们公钥证书
openssl req -x509 -sha256 -nodes -newkey rsa:4096 -keyout private.key -out public.pem
最后,我编写了以下函数,分别使用它们的公钥加密和使用我的私钥解密
async function RSA_Encrypt(str) {
const publicKey =
fs.readFileSync(path.resolve("./their/UAT_PUBLIC_CERT.txt"), "utf8");
const buffer = Buffer.from(str);
const encrypted = publicEncrypt({ key: publicKey, padding:
constants.RSA_PKCS1_PADDING }, buffer);
return encrypted.toString("base64");
}
async function RSA_Decrypt(str) {
const privateKey = fs.readFileSync(path.resolve("./my/private.key"),
"utf8");
const buffer = Buffer.from(str, "base64");
const decrypted = privateDecrypt({ key: privateKey, padding:
constants.RSA_PKCS1_PADDING }, buffer);
return decrypted.toString("utf8");
}
现在,我通过使用RSA_Encrypt
函数对请求主体进行加密来向他们发送请求。他们使用加密的响应进行回复,使用RSA_Decrypt
函数解密响应后,出现以下错误
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
此外,我还测试了使用公钥的加密和使用我的私钥的解密,效果很好。这是我为测试目的编写的功能,
function RSA_Encrypt(str) {
const publicKey = fs.readFileSync(path.resolve("./my/public.pem"), "utf8");
const buffer = Buffer.from(str);
const encrypted = crypto.publicEncrypt({ key: publicKey, padding:
crypto.constants.RSA_PKCS1_PADDING }, buffer);
return encrypted.toString("base64");
}
function RSA_Decrypt(str) {
const privateKey = fs.readFileSync(path.resolve("./my/private.key"), "utf8");
const buffer = Buffer.from(str, "base64");
const decrypted = crypto.privateDecrypt({ key: privateKey, padding:
crypto.constants.RSA_PKCS1_PADDING }, buffer);
return decrypted.toString("utf8");
}
我认为这是一些填充或模式问题,但我自己无法解决。我可以在privateDecrypt
函数中指定ECB模式吗?他们一方的加密很可能是在JAVA中发生的,那么NodeJ中我缺少什么吗?