在 Java 中生成 PKCS#1 格式的 RSA 密钥

新手上路,请多包涵

当我使用 Java API 生成 RSA 密钥对时,公钥以 X.509 格式编码,私钥以 PKCS#8 格式编码。我希望将两者都编码为 PKCS#1。这可能吗?我花了相当多的时间浏览 Java 文档,但没有找到解决方案。当我使用 Java 和 Bouncy Castle 提供程序时,结果是一样的。

这是代码片段:

 KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA","BC");
keygen.initialize(1024);
KeyPair pair = keygen.generateKeyPair();
PrivateKey priv = pair.getPrivate();
PublicKey pub = pair.getPublic();
byte[] privBytes = priv.getEncoded();
byte[] pubBytes = pub.getEncoded();

生成的两个字节数组的格式为 X.509(公共)和 PKCS#8(私有)。

任何帮助将非常感激。有一些类似的帖子,但没有一个真正回答我的问题。

谢谢你

原文由 Anthony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
1 个回答

您将需要 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

公钥

将公钥从 X.509 SubjectPublicKeyInfo 转换为 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),这些信息帮助我构建了这篇帖子。

原文由 Alexei Khlebnikov 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题