귀하의 코드는 키 자체를 출력 : 여기에
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());
}
개인 키 파일입니다. PKCS # 8로 encode 된 비공개 키에 필요한 알고리즘 지정자가 없어졌습니다. 다행스럽게도 키 자체는 항상 인코딩 할 때 동일한 크기를 갖습니다 (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));
이 코드는 오라클 자바 JRE의 기본 구현과 호환 같은 탄력이 성 호환 둘 다 : 당신은 단순히 다른 키에서 헤더를 연결할 수 있다는 것을 의미한다
. 당신뿐만 아니라 당신의 키 쌍을 생성하는 오라클 호환 코드를 사용할 수 있습니다
참고 :
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("EC");
kpGen.initialize(new ECGenParameterSpec("secp384r1"));
KeyPair ecKP = kpGen.generateKeyPair();
내가 * 당신은 그냥 대신 PKCS # 8의 가장 최소한의 인코딩을 가지고 생각 * 준수 구조. Java에서 자신 만의 PKCS # 8을 만들고 온라인 ASN.1 디코더와 비교하십시오 (먼저 64를 기본으로 인코딩). –
그래, 지금 확인해 보니 PKCS # 8 구조 안의 * X9.62 구조체입니다. –
http://stackoverflow.com/questions/22963581/reading-elliptic-curve-private-key-from-file-with-bouncycastle/41947163 지금 개선됨 –