我使用 OpenSSL 生成了椭圆曲线私钥/公钥对。私钥和公钥均采用 PEM 编码。我已经弄清楚如何加载公钥,感谢this. https://stackoverflow.com/a/40439081但是,我无法弄清楚如何加载私钥,因为上述消息最终以 InvalidKeySpecException: key spec not recognize 结束。
然后我发现this https://stackoverflow.com/a/23369629,但它最终也会出现“编码的密钥规范无法识别”。如何加载我的私钥?
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 编码私钥所需的算法说明符。幸运的是,密钥本身在编码时始终具有相同的大小(它不使用任何 ASN.1 整数,据我所知,它可能具有不同的大小)。
这意味着您可以简单地连接另一个键的标头:
// static header you can put in front
byte[] header = Hex.decode("30 81bf 020100 301006072a8648ce3d020106052b81040022 0481a7");
// your key from the PEM above
byte[] fromPEM = Base64.decode("MIGkAgEBBDD2MFRv6BpJU6/zDI2yBfVbe0oeU1nFAoYMedDGtcdwHyWNJSeiYRBApVNzMxPSBLWgBwYFK4EEACKhZANiAAQBttEp/qUGnDlmL+o6KZnVs+RoBnEBEGhoPxSUu1Xfj77QQqfuqHOCRzWXseQA1aZB/h6VQEiFovugtG1G3HaMxxrqLLxb10g2BMaRcAfZyeqc3O0Ui8XXb1esn0gOrCU=");
byte[] bytes = Arrays.concatenate(header, fromPEM);
PrivateKey ecPrivate = KeyFactory.getInstance("EC").generatePrivate(new PKCS8EncodedKeySpec(bytes));
此代码既与 Bouncy Castle 兼容,又与 Oracle 的 Java JRE 中的默认实现兼容。
请注意,您也可以使用 Oracle 兼容代码来创建密钥对:
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("EC");
kpGen.initialize(new ECGenParameterSpec("secp384r1"));
KeyPair ecKP = kpGen.generateKeyPair();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)