RSAencryption之间的c + +和node.js

我必须通过networking发送一些encryption的数据(websocket)

我使用下面的node.js模块生成了一个密钥对:

https://github.com/juliangruber/keypair

我的公钥像这样:

-----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAlUiMDQsBgj5P/T86w/eg9MXUj8M4WMVihP8YzmDxMqCFb7D+w4N/1XcxWxQT .... Wo+SRCsr6npfp1ctDhMtkXIeNT4lKf3qUGhP5tbx/TreaNF/d8zCeinGR/KeBGadMwIDAQAB -----END RSA PUBLIC KEY----- 

在C ++代码中,我生成了一个RSA类,通过char *

 const char rsaKey1[] = "-----BEGIN RSA PUBLIC KEY-----\n" "MIIBCgKCAQEAlUiMDQsBgj5P/T86w/eg9MXUj8M4WMVihP8YzmDxMqCFb7D+w4N/1XcxWxQT\n" .... "Wo+SRCsr6npfp1ctDhMtkXIeNT4lKf3qUGhP5tbx/TreaNF/d8zCeinGR/KeBGadMwIDAQAB\n" "-----END RSA PUBLIC KEY-----\n"; BIO* bio = BIO_new_mem_buf( rsaKey1, strlen(rsaKey1)); m_rsaPubKey = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); 

usigned m_rsaPubKey,我可以用encryption的数据生成一个unsigned char的std :: vector

  std::vector<u8> Rsa::encrypt(std::string & msg) { std::vector<u8> encryptedData; char *encrypt = new char[RSA_size(m_rsaPubKey)]; int encryptLen; if (encryptLen = RSA_public_encrypt(msg.size() + 1, (unsigned char*)msg.c_str(), (unsigned char*)encrypt, m_rsaPubKey, RSA_PKCS1_OAEP_PADDING) == -1) { LogOutSys("error encoding string"); } for (u32 i = 0; i < strlen(encrypt); i++) { encryptedData.push_back(encrypt[i]); } delete encrypt; return encryptedData; } 

读取公钥或encryption我的数据时,我没有任何错误,所以我假设encryption正常。

然后数据经过一个websocket并被node.js接收

私钥是这样读的:

 var rsa = new RSA(fs.readFileSync("./rsa-keys/sj_private_1.pem"), {encryptionScheme :'pkcs8'}) 

和解码

  var decrypted = rsa.decrypt(data) 

其中数据是具有相同长度和内容的缓冲区(通过websocket发送时不会损坏)

c ++方面:

 encrypted len 256, first bytes 117 125 58 109 

节点大小:

 Buffer(256) [117, 125, 58, 109, 38, 229, 7, 189, …] 

rsa.decrypt生成一个exception:

 TypeError: Cannot read property 'length' of null 

我尝试了几个encryptionScheme选项(包括默认,但总是得到相同的错误或不正确的键或数据

由于OAEP中的随机填充,故障排除encryption问题有时可能有点棘手。

要进一步排除故障,请使用以下清单来消除潜在的问题:

  • 确保在两端使用相同的encryption机制。 在你的C ++代码中,你使用的是RSA_PKCS1_OAEP_PADDING,但是你的问题中的JavaScript行并不能告诉你在那里使用了什么机制。
  • 确保这些机制在C ++和Node库中都以相同的方式实现。 在这两种实现中,具有相同的哈希方法和MGF1(掩码生成函数)是至关重要的。 这是我在职业生涯中遇到的最典型的失败点之一。
  • 由于您正在处理字节数组,因此请确保您没有字节顺序的问题。 换句话说,要确保两端的字节顺序相同(自学: https : //www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html )。