Преврати ключ, закодированный в байт, обратно в его оригинальный ECPublicKey в Bouncy Castle - PullRequest
8 голосов
/ 08 февраля 2010

В Java у меня есть открытый ключ ECDH, который я посылаю в виде байтового массива.

Как только я получу байтовый массив, как я могу превратить его в открытый ключ?

Я использую Bouncy Castle, но Java-решение было бы столь же полезным.

Спасибо

Ответы [ 3 ]

5 голосов
/ 11 февраля 2011

Когда вы получили закодированный ключ, предполагая, что вы использовали метод "[your keyPair] .getPublic (). GetEncoded ()" по умолчанию, это будет работать.

    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;
    }
4 голосов
/ 30 октября 2013

Я обнаружил, что вышеуказанное решение @LaceCard не работает для меня. В общем, это не очевидно, но опять же в криптографии ничего нет;)

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 голосов
/ 08 февраля 2010

Как форматируются необработанные байты для клавиши ECDH? Где вы получаете сырые байты?

Как правило, используется соответствующий * класс Spec для превращения необработанного материала ключа в ключ, но классы ECPublicKeySpec и DHPublicKeySpec не принимают необработанный байтовый массив.

...