1

SpongyCastleで動作する私の Android アプリケーションでは、特定の楕円曲線( prime192v1 )を使用してECDH キー交換を実行したいと考えており、このコードを使用してプライベートおよびパブリック パラメータの byte[] 表現を生成しています。

        try{
            KeyPairGenerator g = KeyPairGenerator.getInstance("ECDH", "SC");

            org.spongycastle.jce.spec.ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");
            g.initialize(ecSpec, new SecureRandom());

            KeyPair kp1 = g.generateKeyPair();
            KeyPair kp2 = g.generateKeyPair();

            // Alice generated this
            byte[] privK1 = kp1.getPrivate().getEncoded();
            byte[] pubK1= kp1.getPrivate().getEncoded();

            // Bob generated this
            byte[] privK2 = kp2.getPrivate().getEncoded();
            byte[] pubK2= kp2.getPrivate().getEncoded();

        }catch(Exception e)
        {
            Log.e(LOGTAG, "Exception caught in ECDHInit function");
        }

ここで、Alice と Bob が秘密鍵をローカルに保存し、交換pubK1pubK2て、共有秘密鍵の設定に進みたいと仮定します (両方の鍵がbyte[]フォーマットされています)。ボブの場合は同じなので、アリスの場合のみ説明します。

KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", "SC");

PrivateKey privateKey = KeyFactory.getInstance("ECDH", "SC").generatePrivate(new PKCS8EncodedKeySpec(privK1));
PublicKey publicKey = KeyFactory.getInstance("ECDH", "SC").generatePublic(new X509EncodedKeySpec(pubK2));

ここで私の質問があります - 次のコードを使用して、アリスとボブの両方に同じ共有秘密を取得することができました

keyAgreement.init(privateKey);
keyAgreement.doPhase(publicKey, true);

byte[] sharedSecret = SHA256(keyAgreement.generateSecret());

しかし、私は私の特別な曲線prime192v1をどこにも指定していません

この方法でこれを提供しようとすると:

org.spongycastle.jce.spec.ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");

keyAgreement.init(privateKey, ecSpec);
keyAgreement.doPhase(publicKey, true);

byte[] sharedSecret = SHA256(keyAgreement.generateSecret());

と言って例外がスローされます

java.security.InvalidAlgorithmParameterException: No algorithm parameters supported

必要なパラメータを指定できないのはなぜですか? KeyAgreement秘密鍵から何らかの形でこれを推測しますか?

ありがとう!

4

1 に答える 1

1

つまり、Android Studio デバッガーの目の前に答えがあったことがわかりました。オブジェクトを調べたところ、選択した曲線のすべての詳細を含むPrivateKey内部メンバーが見つかりました。privateKey.ecSpecしたがって、引数を渡す必要はなく、エラーがスローされます。追加のコードを指定せずにコードを使用してください。ecSpec

于 2015-11-22T04:22:07.600 に答える