我有一个rsa private key.der文件(里面有一堆二进制文件)。如何在java中将文件转换为pem格式?
如果我在命令行中使用openssl,我会这样做: openssl rsa -inform der -in privateKey.der -outform pem -out privateKey.pem
privatekey.pem结果如下所示:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAyljm4IGV2JmL8amyTQz9nCSdtdJV+OGiiyefJasKuNEIVAyV
BzSNEUrJYL1LrAMM0cbenWh3M0I+RoQYfwo3J88fi/aLW5dbdU8bi001UZIeJnEB
...
...
lykp1jNHSXD8PoBNVD+pbY3zGCqH1OgPWd0/+IbMBp3Qo+HMp5Ku9w==
-----END RSA PRIVATE KEY-----
我听说人们说pem只是der加上某些页眉和页脚的base64编码表示。但是,如果我这么做 cat privateKey.der | base64
我从openssl得到了不同的结果: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKWObggZXYmYvxqbJNDP2 ... ... GndCj4cynkq73
尽管有head和footer,pem字符串也不一样。有人知道为什么吗?
有没有像openssl那样的库可以在java中将der转换成pem?我已经搜索了一段时间,但不幸的是,我没有找到任何有效的。任何帮助都将不胜感激!
2条答案
按热度按时间wnvonmuf1#
有许多pem格式,openssl支持十几种pem和der格式的私钥。由编写的格式
openssl rsa [-outform pem]
是算法特定的pkcs1附录a格式,有或没有基于rfc1421的加密,并标有RSA PRIVATE KEY
. 由编写的格式openssl pkey
或者openssl pkcs8 -topk8
是算法的通用pkcs8格式,它定义了自己的加密,并相应地进行了标记PRIVATE KEY
或者ENCRYPTED PRIVATE KEY
--注意:在这两种情况下都没有rsa;见rfc7468。java加密,例如。PrivateKey.getEncoded()
使用未加密的pkcs8,所以如果您从java获得这个der并将其转换为base64,这就是为什么您“得到不同的结果”。另请注意pem是der的base64,每64个字符加上页眉和页脚换行一次;如果没有线断,它就不会一直工作。有关这两种格式的信息,请参见rsa私钥的pkcs#1和pkcs#8格式。如果你有或者可以得到弹性的答案,那么使用bouncycastle是一个很好的解决方案;bcpkix可以正确处理大多数openssl格式。如果您想在不使用bouncy的情况下进行加密,这与如何使用iaik jce在java中使用pkcs#5格式的pbe加密rsa私钥几乎相同(我的)除了没有加密,所以去掉中间的块,稍微更改pem头:
不过,在称之为“更好”之前,我会仔细考虑的。这也类似于将x509公钥转换为rsa公钥以获得公钥(也是我的),与在没有库的java中读取pkcs#1或spki公钥相反。
0kjbasz62#
经过大量的挖掘。。。我找到了一个办法,但看起来多余。如果你有更好的主意,请告诉我。