решено: я тупой Первым аргументом шифрования должен был быть key.size (), а первым аргументом дешифрования должен быть RSA_size (myKey).
Эй, ребята, у меня возникли проблемы с выяснением, как это сделать.
По сути, я просто хочу, чтобы клиент и сервер могли отправлять друг другу зашифрованные сообщения.
Это будет невероятно небезопасно, потому что я пытаюсь все это выяснить, чтобы я мог начать с первого этажа.
Пока у меня все ключи работают, но шифрование / дешифрование дает мне ад.
Начну с того, что использую C ++, но большинству этих функций требуются строки C, поэтому все, что я делаю, может вызывать проблемы.
Обратите внимание, что на стороне клиента я получаю следующую ошибку в отношении расшифровки.
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
Я не совсем понимаю, как работает отступ, поэтому я не знаю, как это исправить.
В любом случае, здесь указаны соответствующие переменные с каждой стороны, за которыми следует код.
Клиент:
RSA *myKey; // Loaded with private key
// The below will hold the decrypted message
unsigned char* decrypted = (unsigned char*) malloc(RSA_size(myKey));
/* The below holds the encrypted string received over the network.
Originally held in a C-string but C strings never work for me and scare me
so I put it in a C++ string */
string encrypted;
// The reinterpret_cast line was to get rid of an error message.
// Maybe the cause of one of my problems?
if(RSA_private_decrypt(sizeof(encrypted.c_str()), reinterpret_cast<const unsigned char*>(encrypted.c_str()), decrypted, myKey, RSA_PKCS1_OAEP_PADDING)==-1)
{
cout << "Private decryption failed" << endl;
ERR_error_string(ERR_peek_last_error(), errBuf);
printf("Error: %s\n", errBuf);
free(decrypted);
exit(1);
}
Сервер:
RSA *pkey; // Holds the client's public key
string key; // Holds a session key I want to encrypt and send
//The below will hold the encrypted message
unsigned char *encrypted = (unsigned char*)malloc(RSA_size(pkey));
// The reinterpret_cast line was to get rid of an error message.
// Maybe the cause of one of my problems?
if(RSA_public_encrypt(sizeof(key.c_str()), reinterpret_cast<const unsigned char*>(key.c_str()), encrypted, pkey, RSA_PKCS1_OAEP_PADDING)==-1)
{
cout << "Public encryption failed" << endl;
ERR_error_string(ERR_peek_last_error(), errBuf);
printf("Error: %s\n", errBuf);
free(encrypted);
exit(1);
}
Позвольте мне еще раз заявить, в случае, если я этого не делал раньше, что я знаю, что мой код отстой, но я просто пытаюсь создать основу для понимания этого.
Извините, если это оскорбляет вас, ветеранов-кодеров.
Заранее благодарим за любую помощь, которую вы, ребята, можете оказать!