Нет такого алгоритма: ECDSA для провайдера BC

Мое приложение minSDK 15 - поэтому я подумал, что могу использовать BouncyCastle напрямую. К сожалению, я получаю NoSuchAlgorithmException. Должен ли я использовать SpongyCastle тогда? Библиотека прекрасно работает в приложении JVM, но не работает на Android.

 Caused by: java.security.NoSuchAlgorithmException: no such algorithm: ECDSA for provider BC
    at sun.security.jca.GetInstance.getService(GetInstance.java:87)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
    at java.security.KeyPairGenerator.getInstance(KeyPairGenerator.java:307)
    at org.kethereum.crypto.Keys.createSecp256k1KeyPair$crypto(Keys.kt:43)
    at org.kethereum.crypto.Keys.createEcKeyPair(Keys.kt:51)
    at org.walleth.data.keystore.KethereumWallethKeyStore.newAddress(KethereumWallethKeyStore.kt:43)
    at org.walleth.activities.CreateAccountActivity$onCreate$4.onClick(CreateAccountActivity.kt:95)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)

2 ответа

Решение

Поддержка Android для ECDSA была введена начиная с версии 4.0 с использованием Bouncycastle (v1.46) в качестве поставщика криптографии по умолчанию. Смотрите блог https://nelenkov.blogspot.com.es/2011/12/using-ecdh-on-android.html?m=1

Но в Android включена сокращенная версия Bouncycastle, и ECDSA не имеет полной поддержки. Вы можете увидеть в ссылке, что алгоритм KeyPairGenerator/ECDSA не поддерживается, который необходим для генерации ключей эфириума.

Вы не можете напрямую включить библиотеку bouncycastle, поскольку существует конфликт с именем пакета org.bouncycastle, Я предлагаю включить spongycastle в ваш проект, который является перепакованной версией bouncycastle для Android org.spongycastle,

Конфликт имен пакетов был разрешен в новых версиях Android, но если ваша цель - старые версии, вам необходимо убедиться, какой поставщик криптографии используется.

Была эта проблема в 2022 году с современной версией Android (API 30) и последней версией web3j.

Проблема решилась проверкой установки надувного замка и заменой его на новый.

      private void setupBouncyCastle() {
    final Provider provider = Security.getProvider(BouncyCastleProvider.PROVIDER_NAME);
    if (provider == null) {
        // Web3j will set up the provider lazily when it's first used.
        return;
    }
    if (provider.getClass().equals(BouncyCastleProvider.class)) {
        // BC with same package name, shouldn't happen in real life.
        return;
    }
    // Android registers its own BC provider. As it might be outdated and might not include
    // all needed ciphers, we substitute it with a known BC bundled in the app.
    // Android's BC has its package rewritten to "com.android.org.bouncycastle" and because
    // of that it's possible to have another BC implementation loaded in VM.
    Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
    Security.insertProviderAt(new BouncyCastleProvider(), 1);
}

Обсуждение этой проблемы находится здесь https://github.com/web3j/web3j/issues/828.

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