views:

752

answers:

4

Hello, I try to encrypt simple text with RSA algorithm. I have a problem with my code.

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 );

The return value of RSA_public_encrypt is 128.
RSA_private_decrypt return -1. If I try to display decrypttext with cout i get nothing.
Thanks.

A: 

Try calling ERR_error_string() to get a text description of the error.

Andreas Magnusson
A: 

Hello, thanks for the answer. I call ERR_error_string() after RSA_private_decrypt method.

i = RSA_private_decrypt(1,sectext, decrypttext, _RSA, RSA_PKCS1_OAEP_PADDING);
char error[256];
ERR_error_string(i,error);

As output I get:
error=error:FFFFFFFF:lib(255):func(4095):reason(4095)
How I can found out what that mean and what should I do. I read it is error code for a internal table. Where I can read more about it and found out what this error code mean.
Thanks.

+2  A: 

You should not pass 1 to RSA_private_decrypt but the length of the block you are trying to decrypt, ie. the return value of RSA_public_encrypt = 128. You do not know the length of the cleartext when you are decrypting!

This complete sample program results in:

128 from encrypt. 
1 from decrypt: 'A'

Source:

#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;
}
Tuminoid
A: 

Thanks! Danke! Cпосиба!
It works!

Then please vote it up and accept.
Tuminoid