我想用Java中的字符串(.pem
文件)生成私鑰。如何從Java中的* pem字符串生成RSA私鑰
private static final String test = "-----BEGIN RSA PRIVATE KEY-----\n" +
"MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" +
// and so on
"-----END RSA PRIVATE KEY-----";
try {
String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");
byte [] encoded = Base64.decode(privKeyPEM);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(keySpec);
}
catch (Exception e) {
e.printStackTrace();
}
最後一行(generatePrivate功能)拋出此異常:
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at Test.main(Test.java:52)
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(Unknown Source)
at sun.security.rsa.RSAKeyFactory.generatePrivate(Unknown Source)
... 3 more
如果我更改私鑰從.der
文件時,它正常工作的價值,但我需要生成私有密鑰文件從.pem
文件。
我附加了字符串打印爲字符串(一次用\ n硬編碼,一次硬編碼沒有\ n)和文件一次的截圖。
奇怪的是,從該文件的輸出是從字符串輸出不同。
如果我嘗試使用Base64對.der
文件進行編碼,則結果與.pem
文件中的字符串不同。爲什麼?
您是否找到答案? –
@SankarP不真的。 – Niklas
好的。我找到了解決方案。以「----- BEGIN RSA PRIVATE KEY」開頭的密鑰是pkcs1編碼的文件。除非您使用像BouncyCastle這樣的外部庫,否則Java不支持此pkcs1編碼。昨天遇到同樣的問題,大約8小時後,我找到了解決方案。如果您使用pkcs8編碼私鑰,它將以「--- BEGIN PRIVATE KEY ---」開始,這將由stock java處理。 HTH。 –