RSA 私钥格式与 Java 转换实战
在 Java 开发中处理加密通信时,RSA 私钥的格式往往是个坑。常见的有 PKCS#1 和 PKCS#8 两种,虽然本质都是私钥,但编码结构不同,直接混用会导致解析失败。
私钥格式区别
PKCS#1
这是最传统的格式,只包含 RSA 算法相关的参数。
-----BEGIN RSA PRIVATE KEY-----
...base64...
-----END RSA PRIVATE KEY-----
生成命令:
openssl genrsa -out pkcs1.pem 2048
PKCS#8
这是更通用的标准,支持多种算法,通常用于 Java 环境。
-----BEGIN PRIVATE KEY-----
...base64...
-----END PRIVATE KEY-----
转换命令(PKCS#1 转 PKCS#8):
openssl pkcs8 -topk8 -in pkcs1.pem -out pkcs8.pem -nocrypt
若需从 PKCS#8 转回 PKCS#1,可使用:
openssl rsa -in pkcs8.pem -out pkcs1.pem
私钥 Java 代码转换
为了在 Java 中灵活处理这两种格式,推荐使用 BouncyCastle 库。它提供了强大的 ASN.1 解析能力。
依赖配置
建议引入较新的稳定版本:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
PKCS#1 转 PKCS#8
核心思路是读取 PKCS#1 内容,提取 PrivateKeyInfo 对象,再将其重新编码为 PKCS#8 格式。
org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
org.bouncycastle.openssl.PEMParser;
java.io.StringReader;
java.util.Base64;
[] pkcs1ToPkcs8(String pkcs1Base64) Exception {
[] derBytes = Base64.getDecoder().decode(pkcs1Base64);
PrivateKeyInfo.getInstance(derBytes);
privateKeyInfo.getEncoded();
}

