我一直在敲我的脑袋听一会儿。我使用crypto模块在c ++客户端和node.js服务器之间进行RSA双向握手。 Node.js是版本8.
无论如何,在c ++端,我们有代码执行以下操作:
// c++_cipher -> node.js
RSA_public_encrypt(
payloaddump.length(),
(const unsigned char*)payloaddump.c_str(),
(unsigned char *)cipher,
clusterpub,
RSA_PKCS1_OAEP_PADDING
);
节点将使用它的私钥正确解密它。
// node.js <- c++_cipher
return crypto.privateDecrypt(pem, Buffer.from(payload, 'base64')).toString()
但是,当我在node.js端加载客户端的c ++公共证书并加密某些有效负载时......
// Node.js -> c++
return crypto.publicEncrypt(cpp_pub, Buffer.from(data), crypto.constants.RSA_PKCS1_OAEP_PADDING)
并在c ++端解密为:
// c++ <- node.js cipher
int rsapemsize = RSA_size(mypem);
RSA_private_decrypt(
rsapemsize,
node_cipher,
plain,
mypem,
RSA_PKCS1_OAEP_PADDING
);
我收到以下rsa错误:
error:04065072:rsa routines:rsa_ossl_private_decrypt:padding check failed
我不明白为什么node.js能够解密但c ++不能解密。我已经检查了我的酒吧,pem密钥对一百万次,他们是正确的。我还想声明node.js crypto看起来像是直接绑定到openssl c ++ libs,所以应该使用相同的库?它看起来像实现相同的哈希+ mgf1方案...但是节点使用EVP方法...而不是RSA_public_encrypt虽然它应该无关紧要。不确定我是否可以在Node或openssl端更改它。我错过了什么吗?