Я бьюсь головой, слышу какое-то время. У меня есть двухстороннее рукопожатие RSA между клиентом c ++ и сервером node.js с использованием модуля crypto. 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()
Однако, когда я загружаю общедоступный сертификат c ++ для клиента на конце node.js и шифрую некоторую полезную нагрузку ...
// 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 миллион раз, и они верны. Я также хочу заявить, что crypto node.js выглядит так, как будто он напрямую связывается с библиотеками openssl c ++, поэтому он должен использовать ту же библиотеку? Это также похоже на реализацию той же схемы хеширования + mgf1 ... однако узел использует методы EVP ... не RSA_public_encrypt, хотя это не должно иметь значения. Не уверен, смогу ли я изменить это на стороне Node или openssl. Я что-то упустил?