匹配 NodeJS 中与解密方法兼容的加密方法

问题描述 投票:0回答:1

我在 NodeJS 中有一个方法可以解密来自 C# 请求的有效负载,并且工作正常。

function _decryptMessage(_encryptedData, _encryptedDek, _iv, _privateKey, _kek){

    const decrypted = crypto.privateDecrypt({
      key: _privateKey,
      passphrase: _kek,
      padding: crypto.constants.RSA_PKCS1_PADDING
    }, Buffer.from(_encryptedDek, "base64"));

    const dek = decrypted.toString("utf16le");
    const buff = Buffer.from(_encryptedData, "base64");
    const key = Buffer.from(dek, "utf8");
    const iv = Buffer.from(_iv, "utf8");
    const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);

    return decipher.update(buff).toString() + decipher.final().toString();
 }

出于单元测试的原因,我想编写一个 NodeJS 等效方法来加密可以通过上述函数解密的 json 有效负载。 我正在尝试恢复代码,但缺少一些内容,因为我收到 error:0200009F:rsaroutines::pkcs 解码错误

这是我无法完成的未完成的方法:

function _encrypt(_publicKey, _data){

    const dek = "bf3c199c2470cb477d907b1e0917c17b";
    const iv = "5183666c72eec9e4";

    const encryptedData= (() => {

      const cipher = crypto.createCipheriv("aes-256-cbc", dek, iv);
      let encryptedData = cipher.update(_data, 'utf8', 'base64');
      encryptedData += cipher.final('base64');

      return {
        encryptedData
      };

    })();

    const encryptedDek = crypto.publicEncrypt({
      key: _publicKey,
      oaepHash: "sha1",
      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
    }, dek).toString("base64");
    return {
      encryptedDek,
      iv,
      encryptedData
    };

 }

我需要帮助来完成可以按原样使用上述解密的加密方法。

node.js encryption aes
1个回答
0
投票

_encrypt()
功能中:

  • RSA 加密的 AES 密钥必须使用 UTF-16LE 编码
  • 必须应用 PKCS#1 v1.5(而不是 OAEP)
  • encryptedData
    必须作为字符串返回(而不是作为对象)
function _encrypt(_publicKey, _data){

    const dek = "bf3c199c2470cb477d907b1e0917c17b";
    const iv = "5183666c72eec9e4";

    const encryptedData= (() => {
        const cipher = crypto.createCipheriv("aes-256-cbc", dek, iv);
        let encryptedData = cipher.update(_data, 'utf8', 'base64');
        encryptedData += cipher.final('base64');
        return encryptedData; // Fix 3
    })();

    const encryptedDek = crypto.publicEncrypt({
        key: _publicKey,
        padding: crypto.constants.RSA_PKCS1_PADDING // Fix 2
    }, Buffer.from(dek, 'utf16le')).toString("base64"); // Fix 1
    
    return {
        encryptedDek,
        iv,
        encryptedData
    };
}

通过此更改,可以使用

_encrypt()
解密使用
_decryptMessage()
生成的密文。

© www.soinside.com 2019 - 2024. All rights reserved.