1

I have a PKCS#8 private key as a string in a variable. How to convert that into a PKCS#1 private key as a string

In other words, how to convert the below content

-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----

to

-----BEING RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

using java

PS: There is a straight forward solution in python here - Python convert Private Key to RSA Key Can some please give some pointers on how to do in Java

Topaco
  • 40,594
  • 4
  • 35
  • 62
newbie
  • 1,282
  • 3
  • 20
  • 43

1 Answers1

1

One possibility is BouncyCastle. This supports parsing and writing of PEM encoded keys as well as the conversion from PKCS#8 to PKCS#1:

import java.io.StringReader;
import java.io.StringWriter;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemObjectGenerator;

...

String pkcs8pem = "-----BEGIN PRIVATE KEY-----...";

// Parse
PEMParser pemParser = new PEMParser(new StringReader(pkcs8pem));
PrivateKeyInfo pkInfo = ((PrivateKeyInfo)pemParser.readObject());
pemParser.close();

// Convert
ASN1Encodable pkcs1ASN1Encodable = pkInfo.parsePrivateKey();
ASN1Primitive privateKeyPkcs1ASN1 = pkcs1ASN1Encodable.toASN1Primitive();

// Write
StringWriter stringWriter = new StringWriter();
JcaPEMWriter jcaPEMWriter = new JcaPEMWriter(stringWriter);
jcaPEMWriter.writeObject((PemObjectGenerator)new PemObject("RSA PRIVATE KEY", privateKeyPkcs1ASN1.getEncoded()));
jcaPEMWriter.close();
String pkcs1pem = stringWriter.toString(); // -----BEGIN RSA PRIVATE KEY-----...
Topaco
  • 40,594
  • 4
  • 35
  • 62