使用NodeJ中的私钥进行RSA解密

时间:2020-04-23 07:06:12

标签: java node.js encryption cryptography rsa

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

这就是他们告诉我要做的

公开密钥证书(4096位)。用于加密和解密。 (Zip文件)或公钥要求具有自签名证书(4096位格式)。证书格式应为X.509证书,以“开始证书”开头,以“结束证书”结尾

加密过程:-

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

解密过程:-

  1. Base64Decode
  2. 通过使用合作伙伴私钥证书进行
  3. 非对称解密(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中发生的,那么NodeJ中我缺少什么吗?

0 个答案:

没有答案