Я использовал библиотеку openssl для шифрования / дешифрования RSA в c ++ (android ndk), и она работает нормально. Но когда я зашифровал данные на сайте тестера RSA и расшифровал их на c ++, openssl возвращает эту ошибку:
0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag
Вот мой код:
typedef unsigned char byte;
char plainText[256] = "Test";
char publicKey[2048] = "-----BEGIN PUBLIC KEY-----\n
..."
char privateKey[2048] = "-----BEGIN RSA PRIVATE KEY-----\n"
...
RSA *rsa = createRSA(reinterpret_cast<unsigned char *>(publicKey), 1);
int size = RSA_size(rsa);
if (size < 0)
throw std::runtime_error("RSA_size failed");
std::string encrypted = "BVAbJHA8v1qo8JIyqLZb/wpAQQeQnSiUzO3Ajfo3cT0nQ+fWay1MLHY6Ra+XM6OswX7f4CVG0mgvJlLmMrEki12tEDNmVR63FZZOgW2jMRLSR6ZH2zPVW1fVh709xhFgp/YWagCmtlAHLCzwvbYkpDDSnZ5HLPL5oZE9VeMUlDCsVz4cvN8+e1Qv7PXwxtJjirDpwXUCW89qoKGk1UOoTPacRN8GpNo0ci96rqodoG5D8RYhBd0J1XBwtxWT91/qMUAV+xJbuO7mNLBjY+6tyJ1yOL4s2Ka0wQmLC+Kpk8IqBiuW16xcXdQXmtMU3r5gP6gl7SuQyFp0C8gK5aOpwQ==";
unsigned char decrypted[2048] = {};
char *errorChar = new char[120];
//padding RSA_PKCS1_PADDING
//int retEnc = RSA_public_encrypt(strlen(plainText),
// reinterpret_cast<const unsigned char //*>(plainText), (byte*)&encrypted[0], rsa, RSA_PKCS1_PADDING);
//if (retEnc < 0) {
// std::string errorMsg;
// errorMsg.resize(256);
// (void) ERR_error_string(ERR_get_error(), &errorMsg[0]);
// throw std::runtime_error("RSA_public_encrypt failed");
// }
// encrypted.resize(retEnc);
RSA *pk = createRSA(
reinterpret_cast<unsigned char *>(privateKey), 0);
int decrypted_length = RSA_private_decrypt(RSA_size(rsa), reinterpret_cast<const unsigned char *>(encrypted.c_str()), decrypted, pk , RSA_PKCS1_PADDING);
if (decrypted_length == -1) {
long Error = ERR_get_error();
const char *MSG = ERR_error_string(Error, NULL);
exit(0);
}
В чем причина получения ошибка?