Generating RSA keys in pkcs#1 format in Java
Original address: https://stackoverflow.com/questions/7611383/generating-rsa-keys-in-pkcs1-format-in-java
When I generate an RSA key pair using the Java API,the public key is encoded in the X.509 format and the private key is encoded in the PKCS#8 format. I'm looking to encode both as PKCS#1. Is this possible? I've spent a considerable amount of time going through the Java docs but haven't found a solution. The result is the same when I use the Java and the Bouncy Castle providers.
Here is a snippet of the code:
The two resulting byte arrays are formatted as X.509 (public) and PKCS#8 (private).
Any help would be much appreciated. There are some similar posts but none really answer my question.
Thank You
You will need BouncyCastle:
The code snippets below have been checked and found working with Bouncy Castle 1.52.
Private key
Convert private key from PKCS8 to PKCS1:
<span class="typ">PrivateKeyInfo<span class="pln"> pkInfo <span class="pun">=<span class="pln"> <span class="typ">PrivateKeyInfo<span class="pun">.<span class="pln">getInstance<span class="pun">(<span class="pln">privBytes<span class="pun">);<span class="pln">
ASN1Encodable encodable <span class="pun">=<span class="pln"> pkInfo<span class="pun">.<span class="pln">parsePrivateKey<span class="pun">();<span class="pln">
ASN1Primitive primitive <span class="pun">=<span class="pln"> encodable<span class="pun">.<span class="pln">toASN1Primitive<span class="pun">();<span class="pln">
<span class="kwd">byte<span class="pun">[]<span class="pln"> privateKeyPKCS1 <span class="pun">=<span class="pln"> primitive<span class="pun">.<span class="pln">getEncoded<span class="pun">();
Convert private key in PKCS1 to PEM:
Check with command line OpenSSL that the key format is as expected:
Public key
Convert public key from X.509 SubjectPublicKeyInfo to PKCS1:
<span class="typ">SubjectPublicKeyInfo<span class="pln"> spkInfo <span class="pun">=<span class="pln"> <span class="typ">SubjectPublicKeyInfo<span class="pun">.<span class="pln">getInstance<span class="pun">(<span class="pln">pubBytes<span class="pun">);<span class="pln">
ASN1Primitive primitive <span class="pun">=<span class="pln"> spkInfo<span class="pun">.<span class="pln">parsePublicKey<span class="pun">();<span class="pln">
<span class="kwd">byte<span class="pun">[]<span class="pln"> publicKeyPKCS1 <span class="pun">=<span class="pln"> primitive<span class="pun">.<span class="pln">getEncoded<span class="pun">();
Convert public key in PKCS1 to PEM:
Check with command line OpenSSL that the key format is as expected:
Thanks
Many thanks to the authors of the following posts:
Those posts contained useful,though sometimes outdated info (i.e. for older versions of BouncyCastle),that helped me to construct this post.