首页 > 解决方案 > 在 NodeJs 中使用私钥进行 RSA 解密

问题描述

我正在集成第三方 API 服务,为了安全起见,他们要求我们以加密格式交换信息。因此,他们要求我创建一个 RSA 公钥/私钥并与他们共享公钥。

这就是他们告诉我的

4096 位公钥证书。用于加密和解密。(Zip 文件)或需要公钥自签名证书(4096 位格式)。证书格式应为 X.509 证书应以“Begin Certificate”开头并以“End Certificate”结尾</p>

加密过程:-

  1. 具有 RSA 4096 位公钥(证书)的非对称加密(RSA_Encrypt),模式/填充为 ECB/PKCS1。
  2. Base64 编码。
  3. 在加密过程中,合作伙伴应使用我们的公钥证书。

解密过程:-

  1. Base64解码
  2. 使用合作伙伴私钥证书进行非对称解密(RSA_Decrypt)。

所以,我运行了以下命令并给了他们公钥证书

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 中,那么我在 NodeJs 中遗漏了什么吗?

标签: javanode.jsencryptioncryptographyrsa

解决方案


推荐阅读