바이트 인코딩 된 키를 바운지 성으로 원래의 ecpublickey로 다시 돌리십시오.
-
19-09-2019 - |
문제
Java에는 바이트 어레이로 보내는 ECDH 공개 키가 있습니다.
바이트 배열을받은 후에는 어떻게 공개 키로 되돌릴 수 있습니까?
나는 탄력 성을 사용하고 있지만 Java 솔루션도 유용 할 것입니다.
감사
해결책
ECDH 키에 대해 원시 바이트는 어떻게 형식화됩니까? 원시 바이트는 어디서 구하고 있습니까?
일반적으로 하나는 적절한 *사양 클래스를 사용하여 원시 키 자료를 키로 전환하지만 ecpublickeyspec 그리고 dhpublickeyspec 클래스는 원시 바이트 어레이를 허용하지 않습니다.
다른 팁
인코딩 된 키를 얻었을 때 [your your kyypair] .getPublic (). getencoded ()"메소드를 사용했다고 가정하면 작동합니다.
X509EncodedKeySpec ks = new X509EncodedKeySpec(pubKeyByteString.toByteArray());
KeyFactory kf;
try {
kf = java.security.KeyFactory.getInstance("ECDH");
} catch (NoSuchAlgorithmException e) {
log.error("Cryptography error: could not initialize ECDH keyfactory!", e);
return;
}
ECPublicKey remotePublicKey;
try {
remotePublicKey = (ECPublicKey)kf.generatePublic(ks);
} catch (InvalidKeySpecException e) {
log.warn("Received invalid key specification from client",e);
return;
} catch (ClassCastException e) {
log.warn("Received valid X.509 key from client but it was not EC Public Key material",e);
return;
}
@lacecard의 위의 솔루션이 저에게 효과가 없다는 것을 알았습니다. 일반적으로 이것은 분명하지 않지만 암호화에서 다시는 아무것도 없습니다.)
String key = "MihU9ztW9sEvkBL6BxyaOMgkSbodNS8yoHaHcio+WE...blahblah"
byte[] keyBytes = Base64.decode(key);
//If using Android and Spongycastle provider should be "SC"
KeyFactory kf = KeyFactory.getInstance("ECDH", "BC");
//CURVE_NAME e.g prime192v1
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(CURVE_NAME);
ECPoint point = ecSpec.getCurve().decodePoint(keyBytes);
ECPublicKeySpec pubSpec = new ECPublicKeySpec(point, ecSpec);
ECPublicKey myECPublicKey = (ECPublicKey) kf.generatePublic(pubSpec);
참고 : 잠재적 예외를 적절하게 처리해야합니다.
제휴하지 않습니다 StackOverflow