>       From: owner-openssl-us...@openssl.org On Behalf Of krishnamurthy
santhanam
>       Sent: Wednesday, 24 August, 2011 02:32
        
>       Basically when we encrypt something using an RSA key (whether public

> or private), the encrypted value must be smaller than the key (due to 
> the maths used to do the actual encryption). So if you have a 1024-bit
key, 
> in theory we could encrypt any 1023-bit value (or a 1024-bit value smaller

> than the key) with that key.

More precisely, smaller than the modulus 'N' but 
large enough not to be subject to a trivial break.
An RSA public key is the pair (e,n) where e is usually small, 
and the private key is in principle the pair (d,n) where d is 
usually a substantial fraction of n. RSA private keys may 
and in OpenSSL do also include additional 'Chinese Remainder 
Theorem' aka CRT information to make computation faster.

Plus, most actual RSA encryption schemes add padding.
In particular simply RSA-encrypting raw user data allows 
an adversary to determine if a guessed plaintext is correct, 
which in general is considered an unacceptable weakness.
Thus the value size you can encrypt is somewhat less than 
the RSA modulus size because of this padding; the commonly 
used PKCS#1 v1.5 'classic' and v2 OAEP are 11 and 41 bytes.
If used certain ways v1.5 has weakness (see Bleichenbacher's 
attack on early SSL) which is why OAEP was created.
         
>       below is the code snippet i am trying to do AES Encryption. 
> it works fine. if i see some example in openssl they are using KEY value 
> EVP_MAX_KEY_LENGTH(32 bytes). can i use RSA public key(1024 bit) to
encrypt 
> the same value and use private to decrypt the value. 
         
It's not entirely 'fine', see below. 

EVP_MAX_KEY_LENGTH is the maximum length for *any* (supported)
*symmetric* algorithm. It is useful if you want to write generic 
code that works for various algorithms selectable at runtime, 
as many common systems like SSL/TLS SMIME/CMS/PKCS7 PGP do. 
If you are using only a specific cipher you can use the key length 
for that cipher which might be smaller.

However, the key lengths for *asymmetric* algorithms, including RSA, 
are all separate. You need to use the correct one for each.
         
>               unsigned char key[] =
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
>               unsigned char iv[] = {1,2,3,4,5,6,7,8};
>               char intext[] = "string to make the random number generator
think it has entropy";
>               // Straight encrypt
>                EVP_CIPHER_CTX x;
>               EVP_CIPHER_CTX_init(&x);
>                if(!EVP_EncryptInit_ex(&x, EVP_aes_256_cbc(), NULL, key,
iv))
>                        printf("\n ERROR!! \n");

The key for AES-256 is 32 bytes, and IV for AES-anything 16 bytes.
You are using partly unknown possibly garbage values, which means 
you may be unable to decrypt the result in any other program.
(Of course in any real use the IV should be random or at least unique 
and unpredictable, and the key should be random or at least secret.)

>                if(!EVP_EncryptUpdate(&x, outbuf, &outlen,
> (const unsigned char*) intext, strlen(intext)))
>                       printf("\n ERROR!! \n");
>               if(!EVP_EncryptFinal_ex(&x,outbuf+outlen,&tmplen))
>                       printf("\n ERROR!! \n");
>                outlen+=tmplen;

In general when any OpenSSL call returns an error, you should look 
at the error stack: http://www.openssl.org/support/faq.html#PROG6
For these particular calls (symm encrypt without engine) it's not vital, 
but if and when you start doing other things it becomes valuable.

>        }
>               EVP_CIPHER_CTX_cleanup(&x);

This should be within the routine (before the closing brace).

Now to your actual question:

Yes in abstract you can encrypt and decrypt data directly with RSA. 
In practice people usually don't, because of the limitations.
Most widespread systems like SSL/TLS and SMIME and PGP are 'hybrid', 
where for encryption the data is encrypted with a symmetric algorithm 
and a random 'working' or 'session' key, and public-key algorithms 
like RSA DH or ECDH are used to transfer or share that working key;
in the simplest case, the working key is just RSA-encrypted.
Similarly for signing people don't actually RSA-sign their data; 
instead a hash like SHA1 is computed from the data, and that hash 
(plus limited overhead like an OID) is signed by RSA or [EC]DSA.
These hybrids are what EVP_{Seal,Open}* and EVP_{Sign,Verify}* do.



______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to