org bouncy java encryption bouncycastle elliptic-curve

java - org - Convierta una clave codificada en bytes en su original ECPublicKey en Bouncy Castle



bouncycastle java download (3)

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

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

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

Gracias


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

En general, uno usa 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 .


Cuando obtuviste la clave codificada, suponiendo que utilizaste el método predeterminado "[tu 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; }


Encontré que la solución anterior de @LaceCard no funcionaba para mí. En general, esto no es obvio, pero tampoco hay nada en la criptografía;)

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: deberá manejar las posibles excepciones de forma apropiada