2 回答
TA贡献1828条经验 获得超6个赞
请注意,关于getFormat Javadoc,这是 ASN.1 标准格式:
返回此键的主要编码格式的名称,如果此键不支持编码,则返回 null。如果此密钥的 ASN.1 规范存在,则主要编码格式根据适当的 ASN.1 数据格式命名。例如,公钥的ASN.1数据格式的名称是SubjectPublicKeyInfo,由X.509标准定义;在这种情况下,返回的格式是“X.509”。同样,私钥的 ASN.1 数据格式的名称是 PrivateKeyInfo,由 PKCS #8 标准定义;在这种情况下,返回的格式是“PKCS#8”。
但是,如果我们出于某种原因需要更改它,我们可以使用 Bouncy Castle:例如:
//Convert to PKCS#1
PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(kg.getPrivateKey().getEncoded());
ASN1Encodable encodable = pkInfo.parsePrivateKey();
ASN1Primitive primitive = encodable.toASN1Primitive();
byte[] privateKeyPKCS1 = primitive.getEncoded();
//kg.writeToFile(PRIVATE_KEY_PATH, privateKeyPKCS1);
//Convert to 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();
kg.writeToFile(PRIVATE_KEY_PATH, pemString.getBytes());
我们会得到一个这样的文件:
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAr76DpCYkQKMCKRyjx9wyVKihU4vSBeTq7VpkJx9g616AUTtI
yzMZyHa2vVucgkZL9VFS+ZwJZk7b6pNUUSwnwKxHFnRndid2Hum1ZZZCzRYwhsKq
. . .
XIA+HTgaXbEsCyDcX7EWVlpnTzq5ASO2llKT8V0Mswyh2fznbm5nH92fUKUku2nL
VAQC2f8PL2eLec3wmb0ZWBazadakMC1fVH3umiBmFnkyDoEfojdOgSo=
-----END RSA PRIVATE KEY-----
我使用了这个 BouncyCastle 版本:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.60</version>
</dependency>
这个问题讨论了同样的问题,但对于公钥编码:Generating RSA keys in PKCS#1 format in Java
感谢@dave_thompson_085 的评论,我意识到使用JcaMiscPEMGenerator类的另一种方法
JcaMiscPEMGenerator generator = new JcaMiscPEMGenerator(kg.getPrivateKey());
stringWriter = new StringWriter();
pemWriter = new PemWriter(stringWriter);
pemWriter.writeObject(generator.generate());
pemWriter.close();
pemString = stringWriter.toString();
kg.writeToFile(PRIVATE_KEY_PATH, pemString.getBytes());
要使用它,我们需要添加以下依赖项:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.60</version>
</dependency>
TA贡献1829条经验 获得超7个赞
现在我已经花了几个小时,我觉得很愚蠢..我会把答案放在这里。
所以问题是我想将其存储为字符串(在文本文件中存储二进制文件的内容 - 就像上图所示的那个)
如果您使用的是基于 Unix 的系统,您可以通过以下方式轻松获得:
base64 filename.key > string.txt
现在,如果您想恢复二进制文件,就像:
base64 -D string.txt > filename-clone.key
所以这不是java相关的问题
添加回答
举报