RSA_private_decrypt возвращает -1 - PullRequest
4 голосов
/ 09 января 2009

Я пытаюсь зашифровать простой текст с помощью алгоритма RSA. У меня проблема с моим кодом.

RSA        *_RSA ;
unsigned char text[2560] = "A";
unsigned char sectext[2560];
unsigned char decrypttext[2560];
int i = 0;

_RSA = RSA_generate_key ( 1024, 65537, NULL, NULL );
i = RSA_public_encrypt ( 1, text,    sectext,     _RSA, RSA_PKCS1_OAEP_PADDING );
i = RSA_private_decrypt( 1, sectext, decrypttext, _RSA, RSA_PKCS1_OAEP_PADDING);
RSA_free ( _RSA );

Возвращаемое значение RSA_public_encrypt равно 128, что является размером зашифрованного текста. RSA_private_decrypt возвращает -1, что является ошибкой. Если я пытаюсь отобразить восстановленный текст, я ничего не получаю.

Почему RSA_private_decrypt возвращает -1?

Ответы [ 2 ]

8 голосов
/ 09 января 2009

Вы должны передавать не 1 RSA_private_decrypt, а длину блока, который вы пытаетесь расшифровать, т.е. возвращаемое значение RSA_public_encrypt = 128. Вы не знаете длину открытого текста при расшифровке!

В результате выполнения этого полного примера программы:

128 from encrypt. 
1 from decrypt: 'A'

Источник:

#include <openssl/rsa.h>
#include <openssl/engine.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    RSA *myRSA;
    unsigned char cleartext[2560] = "A";
    unsigned char encrypted[2560] = { 0 };
    unsigned char decrypted[2560] = { 0 };
    int resultEncrypt = 0;
    int resultDecrypt = 0;

    myRSA = RSA_generate_key ( 1024, 65537, NULL, NULL );
    resultEncrypt = RSA_public_encrypt ( 1 /* strlen(cleartext) */, cleartext, encrypted, myRSA, RSA_PKCS1_OAEP_PADDING );
    printf("%d from encrypt.\n", resultEncrypt);
    resultDecrypt = RSA_private_decrypt( 128 /* resultEncrypt */, encrypted, decrypted, myRSA, RSA_PKCS1_OAEP_PADDING);
    printf("%d from decrypt: '%s'\n", resultDecrypt, decrypted);
    RSA_free ( myRSA );

    return 0;
}
0 голосов
/ 09 января 2009

Попробуйте вызвать ERR_error_string(), чтобы получить текстовое описание ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...