9
votes

Tournez une clé encodée d'octet dans son original ECPublicKey en château gonflable

En Java, j'ai une clé publique ECDH que j'envoie en tant que tableau d'octets.

Une fois que j'ai reçu le tableau d'octets, comment puis-je le retourner dans une clé publique?

J'utilise le château de Bouncy, mais une solution Java serait tout aussi utile.

merci


1 commentaires

Quelle est la classe que vous utilisez pour représenter votre clé publique Java ECDH? Vous obtenez de meilleures réponses en montrant votre code et n'exigeant pas que les gens devinent.


3 Réponses :


-1
votes

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

Généralement, on utilise la classe de spécifications appropriée * pour transformer le matériau de clé brute en une clé, mais le ECPublickeyspec et dhpublickeyspec classes n'accepte pas un tableau d'octet brut.


0 commentaires

7
votes

Lorsque vous avez obtenu la clé codée, en supposant que vous utilisiez la méthode par défaut "[votre clé KeyPair] ..gepublic (). GetCeucoded ()", 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;
    }


1 commentaires

Je reçois java.security.spec.invalidkeyspecException: Spécification de clé codée non reconnue



5
votes

J'ai trouvé la solution ci-dessus par @lacecard ne fonctionnait pas pour moi. En général, ce n'est pas évident, mais à nouveau, rien dans la cryptographie n'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);


0 commentaires