Convertir una clave de bytes codificados de nuevo en ella de ECPublicKey original en Castillo Hinchable

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

Pregunta

En Java tengo una clave pública ECDH que estoy enviando como una matriz de bytes.

Una vez que haya recibido la matriz de bytes cómo puedo convertirla de nuevo en una clave pública?

Estoy utilizando Castillo Hinchable, sino una solución de Java sería igual de útil.

Gracias

¿Fue útil?

Solución

¿Cómo están los bytes sin formato para la clave ECDH? ¿Dónde estás recibiendo los bytes sin formato?

Generalmente, se utiliza la clase * Spec apropiado para convertir el material de claves en bruto en una clave pero la ECPublicKeySpec y clases DHPublicKeySpec no aceptan una matriz de bytes en bruto.

Otros consejos

Cuando tienes la llave codificada, suponiendo que se utiliza el valor predeterminado "[su par de claves] .getPublic (). GetEncoded ()" método, esto va a funcionar.

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

He encontrado la solución anterior por @LaceCard no funcionó para mí. En general, esto no es evidente pero de nuevo no hay nada en la criptografía es;)

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

Nota: necesitará para manejar las posibles excepciones debidamente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top