RSA_private_encrypt всегда терпит неудачу

Я изучаю использование библиотеки OpenSSL в своей программе. Здесь, в коде, я генерирую закрытый ключ и сразу же шифрую сообщение с помощью этого ключа. Но всегда это терпит неудачу. Пожалуйста, помогите мне.

private_key = RSA_generate_key(RSA_KEY_LENGTH, RSA_3, NULL, NULL); if (RSA_check_key(private_key) < 1) { printf("generate_key: key generation failed\n"); exit(-1); } unsigned char msg[25]; unsigned char cipher[128]; strcpy((char*)msg, "hello"); int ret = RSA_private_encrypt(25, msg, cipher, private_key, RSA_PKCS1_OAEP_PADDING); if (ret < 0) { printf("encryption in key generation failed\n"); printf ("%s\n", ERR_error_string (ERR_get_error (), (char *) cipher)); exit (-1); } 

Это всегда терпит неудачу, и это ошибка, которую я получаю с помощью ERR_error_string.

 error:04066076:lib(4):func(102):reason(118) 

Ошибка: 04066076: Lib (4): FUNC (102): причина (118)

Вы можете использовать errstr в OpenSSL, чтобы дать вам значимые сообщения об ошибках (в большинстве случаев):

 $ openssl errstr 0x04066076 error:04066076:rsa routines:RSA_EAY_PRIVATE_ENCRYPT:unknown padding type 

Даже если вы сузили его до RSA_PKCS1_OAEP_PADDING / RSA_PKCS1_PADDING , вы все равно должны использовать RSA_PKCS1_OAEP_PADDING с RSA-шифрованием. Итак, ваша следующая задача – выяснить, что еще не так с вашим кодом.

Вот хорошая запись в блоге о том, почему вы должны избегать заполнения PKCS 1.5 для шифрования RSA: Плохая пара лет для индустрии криптографических токенов .

См. Документацию:

человек RSA_private_encrypt

 RSA_private_encrypt() signs the flen bytes at from (usually a message digest with an algorithm identifier) using the private key rsa and stores the signature in to. to must point to RSA_size(rsa) bytes of memory. padding denotes one of the following modes: RSA_PKCS1_PADDING PKCS #1 v1.5 padding. This function does not handle the algorithmIdentifier specified in PKCS #1. When generating or verifying PKCS #1 signatures, RSA_sign(3) and RSA_verify(3) should be used. RSA_NO_PADDING Raw RSA signature. This mode should only be used to implement cryptographically sound padding modes in the application code. Signing user data directly with RSA is insecure. 

Я не знаю, откуда вы получили RSA_PKCS1_OAEP_PADDING, но только поддерживаемые прокладки перечислены выше.

Я нашел причину этой проблемы. На самом деле метод заполнения RSA_PKCS1_OAEP_PADDING не работает для меня на моих компьютерах centos и ubuntu. Как только я изменил его на RSA_PKCS1_PADDING, он начал работать нормально. Но я не уверен, почему это происходит.