바이트 인코딩 된 키를 바운지 성으로 원래의 ecpublickey로 다시 돌리십시오.

StackOverflow https://stackoverflow.com/questions/2218879

문제

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);

참고 : 잠재적 예외를 적절하게 처리해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top