Я работаю над тем, чтобы защитить сообщение, отправленное с сервера node.js, в приложение на С++.
Из node.js я создал пару ключей.
Я использую node -rsa для чтения открытого ключа на стороне node.js(https://github.com/rzcoder/node-rsa)
var rsa = new nodeRSA(publicKeyBuffer ,{encryptionScheme :'pkcs1'})
Поскольку мое сообщение может быть длинным, я вычисляю salted sha256 сообщения перед вызовом шифрования.
const hash = crypto.createHash('sha256').update(message + config.signSalt).digest('hex')
эта часть работает нормально, потому что я могу генерировать точный хэш на стороне С++.
тогда я вызываю функцию шифрования node -rsa для создания буфера
const signature = rsa.encrypt(hash)
Я пробовал различную кодировку, но поскольку данные отправляются через websocket (+ MsgPack упаковка), двоичный формат является хорошим вариантом
На стороне С++ я читаю сначала ключ для char []
const char keyStr[] = "-----BEGIN RSA PRIVATE KEY-----\n" ..........
BIO* bio = BIO_new_mem_buf(keyStr, (int)strlen(keyStr)); // -1: assume string is null terminated
m_rsaPrivKey = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
if (!m_rsaPrivKey)
LogOutSys("ERROR: Could not load PRIVATE KEY! PEM_write_bio_RSAPrivateKey FAILED: %s\n", ERR_error_string(ERR_get_error(), NULL));
ключ читается без ошибок, после этого я вычисляю хэш из сообщения, создавая std::string из unsigned char buffer
std::string hash = sha256(msg.c_str());
std::string signatureStr(signature.begin(), signature.end());
char *decrypt;
int decryptLen;
decrypt = new char[RSA_size(m_rsaPrivKey)];
decryptLen = RSA_private_decrypt((int)msg.size() + 1, (unsigned char*)msg.c_str(), (unsigned char*)decrypt, m_rsaPrivKey, RSA_NO_PADDING /* RSA_PKCS1_OAEP_PADDING */ );
if (decryptLen == -1)
{
char errStr[130];
ERR_error_string(ERR_get_error(), errStr);
LogOutSys("Rsa::decrypt - Error decrypting string ssl error %s", errStr);
}
for (int i = 0; i < decryptLen; i++)
{
decryptData.push_back(decrypt[i]);
}
delete decrypt;
дешифрование завершилось ошибкой со следующей ошибкой
Rsa:: decrypt - Ошибка дешифрования строки ssl error error: 0406506C: lib (4): func (101): reason (108)
Я пробовал различный режим кодирования и заполнения, но всегда получал ошибку.