【发布时间】:2017-06-15 03:14:49
【问题描述】:
我使用 OpenSSL 生成了一个椭圆曲线私钥/公钥对。私钥和公钥是 PEM 编码的。感谢this.,我已经知道如何加载公钥但是,我不知道如何加载私钥,因为上面的消息只是以 InvalidKeySpecException: key spec notrecognized 结束。
然后我找到了this,但它也以“无法识别的编码密钥规范”告终。如何加载我的私钥?
private PrivateKey loadPrivateKey(String location) {
try {
// Strip the guarding strings
byte[] bytes = stripGuardLines(location);
return KeyFactory.getInstance("ECDH").generatePrivate(new PKCS8EncodedKeySpec(bytes));
} catch (FileNotFoundException e) {
LoggerFactory.getLogger("Nectar").error("Failed to find Private KEY: " + location);
System.exit(1);
} catch (IOException e) {
LoggerFactory.getLogger("Nectar").error("IOException while loading Private Key!");
e.printStackTrace();
System.exit(1);
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
System.exit(1);
}
return null;
}
private byte[] stripGuardLines(String location) throws IOException {
BufferedReader r = new BufferedReader(new FileReader(location));
String line;
StringBuilder sb = new StringBuilder();
while((line = r.readLine()) != null) {
if(line.contains("EC PRIVATE KEY")) { //Check if guard line
continue;
}
sb.append(line);
}
// Guard lines stripped, now decode base64
return Base64.getDecoder().decode(sb.toString());
}
这是私钥文件:
-----BEGIN EC PRIVATE KEY-----
MIGkAgEBBDD2MFRv6BpJU6/zDI2yBfVbe0oeU1nFAoYMedDGtcdwHyWNJSeiYRBA
pVNzMxPSBLWgBwYFK4EEACKhZANiAAQBttEp/qUGnDlmL+o6KZnVs+RoBnEBEGho
PxSUu1Xfj77QQqfuqHOCRzWXseQA1aZB/h6VQEiFovugtG1G3HaMxxrqLLxb10g2
BMaRcAfZyeqc3O0Ui8XXb1esn0gOrCU=
-----END EC PRIVATE KEY-----
【问题讨论】:
-
我认为您刚刚获得了最少的编码,而不是符合 PKCS#8 的结构。从 Java 创建您自己的 PKCS#8 并与在线 ASN.1 解码器进行比较(首先编码为 base 64)。
-
是的,刚刚确认,这是 在 PKCS#8 结构中的 X9.62 结构。
-
@dave_thompson_085 你可以直接link to your answer点击下方的分享按钮。或以重复的形式关闭问题(调用双重金徽章权力,当心)。
-
@MaartenBodewes:我没有特别链接我的答案,因为它不是(现在)唯一的好答案,也可能不是最好的。我个人使用'openssl to pkcs8 then JCE'或者在证书'openssl to pkcs12'的情况下。我回答关于 BC 只是因为 Q 中的那一点没有得到解决。 :-)
标签: java cryptography bouncycastle private-key elliptic-curve