簡體   English   中英

沒有這樣的算法:提供者 BC 的 ECDSA

[英]no such algorithm: ECDSA for provider 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)

從4.0版開始,使用Bouncycastle(v1.46)作為默認加密提供程序,引入了Android對ECDSA的支持。 參見博客https://nelenkov.blogspot.com.es/2011/12/using-ecdh-on-android.html?m=1

但是Android包括Bouncycastle的簡化版本,並且沒有對ECDSA的完全支持。 您可以在鏈接中看到不支持算法KeyPairGenerator/ECDSA ,這是生成以太坊密鑰所必需的算法。

您不能直接包含org.bouncycastle庫,因為與包名稱org.bouncycastle沖突。 我建議在您的項目中包含spongycastle,它是Android org.spongycastle的重新打包版本。

軟件包名稱沖突已在新的android版本中解決,但是如果您的目標是舊版本,則需要確保正在使用哪個加密提供程序。

現代 Android 版本(API 30)和最新的 web3j 在 2022 年遇到了這個問題。

通過檢查充氣城堡的安裝並將其替換為新的,該問題已得到解決。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM