2010-02-07 9 views
8

In Java ho una chiave pubblica ECDH che sto inviando come array di byte.Trasforma una chiave codificata in byte nel suo ECPublicKey originale in Bouncy Castle

Una volta ricevuto l'array di byte, come posso riportarlo in una chiave pubblica?

Sto usando Bouncy Castle ma una soluzione Java sarebbe altrettanto utile.

Grazie

+1

Qual è la classe che si sta utilizzando per rappresentare il vostro Java ECDH chiave pubblica? Ottieni risposte migliori mostrando il tuo codice e non richiedendo alle persone di indovinare. –

risposta

-1

Come sono i byte prime formattati per la chiave ECDH? Dove stai ottenendo i byte grezzi?

In genere, si utilizza la classe Spec * appropriata per trasformare il materiale chiave in chiave in chiave ma le classi ECPublicKeySpec e DHPublicKeySpec non accettano una matrice di byte non elaborata.

4

Quando si ottiene la chiave codificata, supponendo che si sia utilizzato il metodo predefinito "[your keyPair] .getPublic(). GetEncoded()", funzionerà.

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

hai salvato la mia giornata .. Grazie per la risposta .. – Bunny

+0

Ricevo java.security.spec.InvalidKeySpecException: specifica chiave codificata non riconosciuta – Justas

3

Ho trovato la soluzione di cui sopra da @LaceCard non ha funzionato per me. In generale questo non è ovvio, ma poi di nuovo niente in crittografia è;)

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: è necessario gestire le potenziali eccezioni adeguatamente

Problemi correlati