Вам понадобится BouncyCastle:
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemWriter;
Следующие фрагменты кода были проверены и найдены работающими с Bouncy Castle 1.52.
Закрытый ключ
Конвертировать закрытый ключ из PKCS8 в PKCS1:
PrivateKey priv = pair.getPrivate();
byte[] privBytes = priv.getEncoded();
PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(privBytes);
ASN1Encodable encodable = pkInfo.parsePrivateKey();
ASN1Primitive primitive = encodable.toASN1Primitive();
byte[] privateKeyPKCS1 = primitive.getEncoded();
Преобразовать закрытый ключ в PKCS1 в PEM:
PemObject pemObject = new PemObject("RSA PRIVATE KEY", privateKeyPKCS1);
StringWriter stringWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(stringWriter);
pemWriter.writeObject(pemObject);
pemWriter.close();
String pemString = stringWriter.toString();
Проверьте с помощью командной строки OpenSSL, что формат ключа соответствует ожидаемому:
openssl rsa -in rsa_private_key.pem -noout -text
Открытый ключ
Преобразование открытого ключа из SubjectPublicKeyInfo X.509 в PKCS1:
PublicKey pub = pair.getPublic();
byte[] pubBytes = pub.getEncoded();
SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(pubBytes);
ASN1Primitive primitive = spkInfo.parsePublicKey();
byte[] publicKeyPKCS1 = primitive.getEncoded();
Преобразование открытого ключа в PKCS1 в PEM:
PemObject pemObject = new PemObject("RSA PUBLIC KEY", publicKeyPKCS1);
StringWriter stringWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(stringWriter);
pemWriter.writeObject(pemObject);
pemWriter.close();
String pemString = stringWriter.toString();
Проверьте с помощью командной строки OpenSSL, что формат ключа соответствует ожидаемому:
openssl rsa -in rsa_public_key.pem -RSAPublicKey_in -noout -text
Спасибо
Огромное спасибо авторам следующих постов:
Эти посты содержали полезную, хотя иногда и устаревшую информацию (т.е. для более старых версий BouncyCastle), которая помогла мне создать этот пост.