Android: InvalidKeySpecException: процедуры эллиптической кривой:EC_GROUP_new_by_curve_name:UNKNOWN_GROUP

Я пытаюсь сгенерировать закрытый ключ эллиптической кривой, но продолжаю получать эту ошибку на версиях ОС Android 5 и 6. Ниже приведен код для генерации PrivateKey с криптографией EC.

private static java.security.PrivateKey createPrivateKey(List<PrivateKey> privateKeys, String appInstallationIdentifier) throws Exception {
    PrivateKey privateKey = getPrivateKeyForActivation(privateKeys);
    String key = decryptMessage(privateKey.getEncryptedPrivateKey(), appInstallationIdentifier, privateKey.getIv());

    key = key.replace("-----BEGIN PRIVATE KEY-----", "")
            .replace("-----END PRIVATE KEY-----", "")
            .replaceAll("\\s", "");

    byte[] privateKeyFileContent = decode(key);

    KeyFactory keyFactory = KeyFactory.getInstance("EC");
    PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(privateKeyFileContent);
    return keyFactory.generatePrivate(ks);
}

И вот ошибка, которую я получаю на ОС версий 5 и 6

java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0f06707b:elliptic curve routines:EC_GROUP_new_by_curve_name:UNKNOWN_GROUP

Есть идеи, почему я получаю эти ошибки? Также предполагается, что EC поддерживается на уровне API 11 и выше, поэтому использование EC не должно быть проблемой.

2 ответа

Я хотел бы добавить кое-что к ответу originx.

У меня была точно такая же ошибка при попытке использовать

KeyAgreement.getInstance("ECDH);

Что случилось со мной, так это то, что я добавлял SpongyCastle как SecurityProvider, делая это:

Security.addProvider(new BouncyCastleProvider());

И для некоторых устройств все работало, как ожидалось, но в некоторых некоторых устройствах (а именно LGE Nexus 5) я получил точно такое же исключение.

То, что исправило это для меня, изменило способ, которым я добавил SpongyCastle и сделал:

Security.insertProviderAt(new BouncyCastleProvider(), 1);

Надеюсь это поможет!

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

Некоторые поставщики даже размещают свои собственные версии поставщиков безопасности, что создает еще больше проблем. Я бы порекомендовал попробовать установить свой собственный поставщик безопасности под названием SpongyCastle, и если вы считаете, что EC должен поддерживаться на этих телефонах, вы можете проверить доступные алгоритмы, как предложено здесь:

http://mobile.developer.com/ws/android/encrypting-with-android-cryptography-api.html

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