Nik*_*las 6 java rsa pem der private-key
我想从.pemJava中的字符串(文件)生成私钥.
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();
}
Run Code Online (Sandbox Code Playgroud)
最后一行(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
Run Code Online (Sandbox Code Playgroud)
如果我将私钥更改为.der文件中的值,它可以正常工作,但我需要从.pem文件生成私钥文件.
我附上了以字符串形式打印的字节的屏幕截图(一次用\n硬编码,一次硬编码,没有\n),一次从文件中截取.

奇怪的是文件的输出与字符串的输出不同.
如果我尝试.der使用Base64 对文件进行编码,则结果与.pem文件中的字符串不同.为什么会这样?
小智 1
你说最后一行抛出异常,即
PrivateKey privKey = kf.generatePrivate(keySpec);
上面的行适用于正确设置的关键规格,即
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
所以实际的问题是编码字节数组。你有没有做过System.out byte [] encoded = Base64.decode(privKeyPEM);,看看输出是什么。
据我所知,如果消息采用 MIME 格式,那么在某些字符之后,它会附加回车符和换行符的组合,这样字符串对于电子邮件系统或您使用它的任何地方都不会太长。
最终的字符串测试在您使用的原始文本中有一些“\n”。您确实删除了下面一行中的其他文本,
String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");
Run Code Online (Sandbox Code Playgroud)
但是,看一下字符串,
"MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" +
// and so on
"-----END RSA PRIVATE KEY-----";
Run Code Online (Sandbox Code Playgroud)
它可能还剩下一些 '\n' ,这可能会在生成 keyspec 时导致出现一些不需要的字符。尝试更多 System.out 并查看编码的字节数组是什么样的,并且在此之前检查 String privKeyPEM 并查看其中是否未留下任何额外字符。
希望这有帮助。