2010-02-07 12 views
8

En Java tengo una clave pública ECDH que estoy enviando como una matriz de bytes.Convertir una clave codificada en bytes en su original ECPublicKey en Bouncy Castle

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

Estoy usando Bouncy Castle, pero una solución Java sería igual de útil.

Gracias

+1

¿Cuál es la clase que está utilizando para representar a su Java ECDH ¿Llave pública? Obtendrá mejores respuestas al mostrar su código y no requerir que la gente adivine. –

Respuesta

-1

Cómo se formatean los bytes primas para la clave ECDH? ¿De dónde sacas los bytes crudos?

Generalmente, se utiliza la clase * Spec apropiada para convertir el material de clave sin procesar en una clave, pero las clases ECPublicKeySpec y DHPublicKeySpec no aceptan una matriz de bytes sin formato.

4

Cuando obtuvo la clave codificada, suponiendo que utilizó el método predeterminado "[your keyPair] .getPublic(). GetEncoded()", esto 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; 
    } 
+0

me salvó el día. Gracias por su respuesta. – Bunny

+0

Obtengo java.security.spec.InvalidKeySpecException: especificación de clave codificada no reconocida – Justas

3

Encontré 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

Cuestiones relacionadas