Dr. Stephen Henson wrote:
On Tue, Jun 21, 2005, Nick G. wrote:


Hello,
I have a need to read an encrypted RSA Private Key generated using
openssl with a java program. I have included some background at the end of this message, but my question is basically: how is the pass phrase converted into the key part? I can get the IV from the DEK-Info line, but I can't seem to figure out (by looking at the openssl source) how the key portion of the decryption key is created from the password entered by the user. Right now I am simply converting the pass phrase into a bytes and using that as the key portion. I believe this is incorrect, but I don't know what else to try. Also, I assume that the key is _not_ encrypted with PBE (since it is not padded per pkcs5). Is this assumption correct? Finally, once decrypted, will the key have the same asn1 schema as a key written in the clear?

Please excuse me if these questions are already answered in the archives, as I was unable to locate any posts with this information (probably poor choice of search terms!) Also, if the transformation of the pass phrase into key is covered in some rfc I have yet to discover a shove in the right direction would be appreciated!

Background:
I have been able to generate/convert keys using openssl in the following formats and successfully read them using a java program:

pkcs8 - clear text
pkcs8 - des encrypted
rsa - clear text

However, I'm using the key for Apache mod_ssl and the only formats it seems to accept are:

pkcs8 - clear text
rsa - clear text
rsa - des encrypted

Since we want to protect the key using at least des encryption and I can't seem to make Apache read the pkcs8 format keys when they are encrypted (perhaps the httpd folks are using the wrong callback?), I thought making java decrypt the RSA key would be the "simplest" solution.



Any OpenSSL application should transparently handle PKCS#8 clear text or
encrypted keys. But make sure you have the correct PEM headers.

If you try:

openssl rsa -in key.pem -noout -text

and that can correctly decrypt the key you should have no problems with Apache
unless it does something weird.

The PKCS#8 formats OpenSSL uses are all standard and it can use a variety of
password based encryption (PBE) algorithms included PKCS#5  v1.5, v2.0 and
PKCS#12.

The other 'traditional' format for OpenSSL private key encyption is
non-standard and has remained unchanged since the SSLeay days.

It *is* documented. See:

http://www.openssl.org/docs/crypto/pem.html#PEM_ENCRYPTION_FORMAT

and

http://www.openssl.org/docs/crypto/EVP_BytesToKey.html#KEY_DERIVATION_ALGORITHM

Thank you, this is exactly what I was searching for. Sadly, I had even guessed that maybe the DEK-Info was the salt [and not an IV], and guessed the iteration count might be one, but couldn't get that to work either. Obviously, I gave up to soon!

WRT Apache I did verify that OpenSSL can read the keys I created using:

openssl genrsa -out clr.rsa 1024
 then
openssl pkcs8 -v1 PBE-MD5-DES -in clr.rsa -topk8 -out enc.des.v1.pkcs8
 or
openssl pkcs8 -v2 des -in clr.rsa -topk8 -out enc.des.v2.pkcs8
 or
openssl pkcs8 -v2 des3 -in clr.rsa -topk8 -out enc.des3.v2.pkcs8

and that the output from the command you suggested above is identical for all the keys but that Apache will not accept any of the encrypted PKCS#8 versions (prompts for passphrase, but then claims the pass phrase was bad no matter how many times I try to type it in correctly!). I will report this as bug to them.

FYI, The new Java5 stuff will also croak when deciphering the v2 algorithms claiming that it: "Cannot find any provider supporting 1.2.840.113549.1.5.13" (1.2.etc is the OID for TripleDES, right?)<sigh>

Again, thank you for the help.

Cheers!

Nick
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [email protected]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to