【发布时间】:2018-01-19 17:54:31
【问题描述】:
我必须通过网络(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++ 代码中,我生成了一个通过 char* 读取公钥的 RSA 类
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);
使用 m_rsaPubKey 签名,我能够生成带有加密数据的无符号字符的 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;
}
我在读取公钥或加密我的数据时没有收到任何错误,因此我认为加密正常。
然后数据通过 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 产生了一个异常:
TypeError: Cannot read property 'length' of null
我尝试了几个加密方案选项(包括默认的,但总是得到相同的错误或不正确的密钥或数据
【问题讨论】:
-
您在 C 和节点中使用了哪些 RSA 库?
-
node-rsa 用于解密,keypair 用于生成密钥。 C++ 部分中的 openSSL(OpenSSL 1.0.2l 2017 年 5 月 25 日)
-
哪个节点-rsa? github.com/rzcoder/node-rsa 的那个?另外,您是否考虑过使用基于 TLS 的 WebSocket 来实现安全性?最后,请注意在您的代码中使用
strlen(encrypt),这是不安全的,因为encrypt可能包含嵌入的NULL。RSA_size(m_rsaPubKey)是什么?
标签: c++ node.js encryption cryptography rsa