Можно ли использовать KeyAgreement без AlgorithmParameterSpec?

В моем приложении Android, работающем с SpongyCastle, я хочу выполнить обмен ключами ECDH, используя определенную эллиптическую кривую (prime192v1), и я использую этот код для генерации представления 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");
        }

теперь давайте предположим, что Алиса и Боб сохраняют свои закрытые ключи локально, обмениваются pubK1 а также pubK2 и хотите продолжить настройку общего секрета (оба ключа теперь находятся в 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 как-то вывести это из закрытого ключа?

Спасибо!

1 ответ

Решение

Получается, у меня был ответ прямо передо мной в отладчике Android Studio. После проверки PrivateKey объект, который я нашел внутренний член privateKey.ecSpec который содержит все детали выбранной кривой. Так что передача аргументов не нужна и выдает ошибку, используйте код без предоставления дополнительныхecSpec

Другие вопросы по тегам