2010-02-07 5 views
8

En Java, j'ai une clé publique ECDH que j'envoie en tant que matrice d'octets.Transformez une clé codée en octets en ECPublicKey d'origine dans Bouncy Castle

Une fois que j'ai reçu le tableau d'octets, comment puis-je le réintégrer dans une clé publique? J'utilise Bouncy Castle mais une solution Java serait tout aussi utile.

Merci

+1

Quelle est la classe que vous utilisez pour représenter votre Java ECDH Clé publique? Vous obtenez de meilleures réponses en montrant votre code et en ne demandant pas aux gens de deviner. –

Répondre

-1

Comment sont les octets bruts formatés pour la clé ECDH? Où trouvez-vous les octets bruts?

Généralement, on utilise la classe * Spec appropriée pour transformer la matière de clé brute en clé, mais les classes ECPublicKeySpec et DHPublicKeySpec n'acceptent pas un tableau d'octets bruts.

4

Lorsque vous avez obtenu la clé codée, en supposant que vous utilisiez la méthode par défaut "[votre clé de contact] .getPublic(). GetEncoded()", cela fonctionnera.

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

vous avez sauvé ma journée .. Merci pour votre réponse .. – Bunny

+0

Je reçois java.security.spec.InvalidKeySpecException: spécification de clé codée non reconnue – Justas

3

J'ai trouvé la solution ci-dessus par @LaceCard ne fonctionnait pas pour moi. En général, ce n'est pas évident, mais là encore rien dans la cryptographie est;)

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

Note: vous devrez gérer les exceptions possibles de façon appropriée

Questions connexes