RSAES-PKCS1- V1_5使用NodeJs加密的公共加密

时间:2019-02-07 14:56:19

标签: node.js rsa node-crypto

我正面临一堵墙,试图使用NodeJs加密模块将加密的数据发送到远程服务器。

根据API文档,有效载荷需要使用具有随机生成的KEY和IV的AES-256算法进行加密。

然后使用RSAES-PKCS1-V1_5标准使用共享的私钥对随机生成的KEY和IV进行加密。

最后,使用RSASSA-PKCS1-V1_5签名方案用私钥对加密的有效负载进行签名,然后对SHA1进行哈希处理。

完成后,我编写一个HTTP请求,并将加密的KEY,IV,加密的有效负载和签名传递给删除服务器。

在密码学方面我不是专家,所以我坚信我在某处做错了事。

服务器能够验证签名,这使我确信共享私钥文件没有问题。

但是,服务器无法解密解密有效负载所需的加密的KEY和IV。

我正在使用以下代码进行测试:

const crypto = require('crypto');
const fs = require('fs');

//Generate random KEY and IV
const randomKey = crypto.randomBytes(32);
const randomIV = crypto.randomBytes(16);

//Load private key from disk
const privateKey = fs.readFileSync(__dirname + '/private.key');

//Get data payload that should be encrypted with AES-256
const payload = 'Payload to be sent';

//Encrypt payload with AES-256
const cipher = crypto.createCipheriv('aes-256-cbc', randomKey, randomIV);
const encryptedPayload = Buffer.concat([cipher.update(payload), cipher.final()]);

//Sign the encrypted payload using the RSASSA-PKCS1-V1_5 algorithm
const signer = crypto.createSign('RSA-SHA1');
signer.update(encryptedPayload);
signer.end();
const signature = signer.sign(privateKey); //Sign with the private key

//Encrypt both KEY and IV
const encryptOptions = {
  key: privateKey,
  padding: constants.RSA_PKCS1_PADDING
}
const encryptedKey = crypto.publicEncrypt(encryptOptions, randomKey);
const encryptedIV = crypto.publicEncrypt(encryptOptions, randomIV);

//A function that encodes Buffer type data to base64
const encode = buffer => buffer.toString('base64');

const request = {
  encryptedKey: encode(encryptedKey),
  encryptedIV: encode(encryptedIV),
  encryptedPayload: encode(encryptedPayload),
  signature: encode(signature)
};

const endPoint = require('./end-point');
endPoint.call(request);
//-> Server successfully verifies signature but fails to decrypt encrypted KEY and IV

有人可以指出我做错了什么地方吗?

0 个答案:

没有答案