Girare una chiave di byte codificato nuovamente dentro di essa l'ecPublicKey originale in Bouncy Castle

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

Domanda

In Java ho una chiave pubblica ECDH che io mando come un array di byte.

Una volta ho ricevuto l'array di byte come posso trasformarlo di nuovo in una chiave pubblica?

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

Grazie

È stato utile?

Soluzione

Come sono i byte prime formattati per la chiave ECDH? Dove vuoi arrivare i byte prime?

In generale, si usa la classe * Spec opportuno trasformare il materiale grezzo in chiave di una chiave, ma il ECPublicKeySpec e classi DHPublicKeySpec non accettano un array di byte crudo.

Altri suggerimenti

Quando avete ottenuto la chiave codificata, supponendo che si è utilizzato il default "[propria coppia di chiavi] .getPublic (). GetEncoded ()" il metodo, questo 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;
    }

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 in modo appropriato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top