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