C OpenSSLRSA двойное шифрование не проходит - PullRequest
0 голосов
/ 01 марта 2019

У меня есть 2 процесса, связанных с сокетом.Я использую RSA для шифрования и дешифрования сообщений.Клиент имеет следующие ключи:

    RSA *client_private_key;
    RSA *client_public_key; 
    RSA *server_public_key;

я хочу сначала зашифровать открытый текст с помощью личного ключа клиента, а затем открытого ключа сервера.

unsigned char *plaintext =
    (unsigned char *)"Hello";
int encrypted_length= rsa_prv_encrypt(plaintext, strlen(plaintext), client_private_key, encrypted);
int encrypted_length2 = rsa_pub_encrypt(encrypted, encrypted_length, server_public_key, encrypted2);

encrypted_length2 всегда равно -1,это означает, что с шифрованием что-то пошло не так.

Я проверил следующие сценарии, чтобы убедиться, что функции работают нормально:Зашифровать с помощью закрытого ключа клиента -> Расшифровать с помощью открытого ключа клиентаЗашифровать с помощью открытого ключа клиента -> Расшифровать с помощью ключа личного ключа клиента

Однако двойное шифрование не работает, и я не знаю, почему.Любая идея, в чем может быть проблема, и вторая функция всегда возвращает -1?

1 Ответ

0 голосов
/ 04 марта 2019

RSA не может зашифровать данные, размер которых превышает размер ключа.Например, ключ RSA 4096 может шифровать только 4096 бит данных.

Однако 11 байтов будут зарезервированы для заполнения.Так, например, максимальная полезная нагрузка, которую вы можете зашифровать с помощью 4096-битного ключа RSA, составляет 501 байт.Аналогично, ограничение составляет 245 байт для ключа RSA 2048.

Вывод шифрования RSA всегда равен размеру ключа (например, 512 или 256 байтов).

Это означает, что вы можетене шифруйте зашифрованный BLA-объект RSA ключом того же размера, если только вы не используете «raw rsa encryption», который не выполняет заполнение (потому что 256> 245 и 512> 501).

Если вы хотитеоднако для подписи данных лучше вычислить sha, а затем подписать sha, а не пытаться использовать шифрование без дополнения.

...