我正面临一堵墙,试图使用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
有人可以指出我做错了什么地方吗?