質問

Java では、バイト配列として送信する ECDH 公開キーがあります。

バイト配列を受け取ったら、どうすればそれを公開鍵に戻すことができますか?

私は Bouncy Castle を使用していますが、Java ソリューションも同様に便利です。

ありがとう

役に立ちましたか?

解決

ECDH キーの生のバイトはどのようにフォーマットされますか?生のバイトはどこで入手していますか?

一般に、適切な *Spec クラスを使用して生のキーマテリアルをキーに変換しますが、 ECPublicKeySpec そして DHPublicKeySpec クラスは生のバイト配列を受け入れません。

他のヒント

あなたはデフォルトを使用と仮定すると、符号化された鍵を得たときは、 "[あなたの鍵ペア] .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;
    }

私は@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);

注:あなたが適切に潜在的な例外を処理する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top