【问题标题】:java.security.NoSuchAlgorithmException: no such algorithm: ECDSA for provider BCjava.security.NoSuchAlgorithmException:没有这样的算法:提供者 BC 的 ECDSA
【发布时间】:2019-03-12 13:55:58
【问题描述】:

我正在尝试使用 KeyPairGenerator 函数生成 secp256k1 密钥对。我的功能看起来像

public fun generateSECP256K1Keypair():KeyPair{
  Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider())
  var keypairGen: KeyPairGenerator = KeyPairGenerator.getInstance("ECDSA","BC")
  val spec:ECGenParameterSpec = ECGenParameterSpec("secp256k1")
  keypairGen.initialize(spec, SecureRandom())
  var keyPair:KeyPair= keypairGen.genKeyPair()
  return keyPair;

}

我的 gradle 文件依赖如下所示

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'org.bouncycastle:bcprov-jdk15on:1.61'

}

当我尝试执行此功能时,我收到以下错误

Process: com.example.myapplication, PID: 6477
java.lang.RuntimeException: Unable to create service com.example.myapplication.service.Myservice: java.security.NoSuchAlgorithmException: no such algorithm: ECDSA for provider BC
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:3201)
    at android.app.ActivityThread.-wrap5(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
    at android.os.Handler.dispatchMessage(Handler.java:102)

如果我使用 SpongyCastle 而不是 BouncyCastle,它可以正常工作。但我不想在我的情况下使用 SpongyCastle 提供程序。

【问题讨论】:

标签: android kotlin bouncycastle spongycastle


【解决方案1】:

我找到了,请阅读。

从 4.0 版开始引入了对 ECDSA 的 Android 支持,使用 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 包含在您的项目中,它是针对 Android org.spongycastle 的 bouncycastle 的重新打包版本。

包名冲突已在新的 android 版本中解决,但如果您的目标是旧版本,则需要确保使用的是哪个加密提供程序。

【讨论】:

  • 但正如我之前提到的,我不想去海绵城堡供应商。有没有办法摆脱这个。
【解决方案2】:

这段代码对我来说很好用

public fun generateSECP256K1Keypair():KeyPair{
  Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider())
  var keypairGen: KeyPairGenerator = KeyPairGenerator.getInstance("EC","BC")
  val spec:ECGenParameterSpec = ECGenParameterSpec("secp256k1")
  keypairGen.initialize(spec, SecureRandom())
  var keyPair:KeyPair= keypairGen.genKeyPair()
  return keyPair;

【讨论】:

    【解决方案3】:

    bouncycastle 和 spongycastle 之间存在包名冲突。

    Spongycastle 是 BouncyCastle 的重新编译和测试版本。如果您真的想使用 Bouncycastle,我认为唯一的解决方案是将 bouncycastle 的整个源代码包含在您的应用程序中,重命名包名称

    【讨论】:

    • 是否可以在android Studio中手动导入Bouncy-castle库,换个名字。通过从官方 BC 网站下载 jar 文件。 ??
    • @NaveenKumar 你支持android 3.0 或更低版本吗?如果没有,那么您可以像往常一样导入 bouncycastle 库并使用它。 Bouncycastle 捆绑在 android 中的包从 org.bouncycastle 重命名为 com.android.org.bouncycastle,因此不会与最新版本的库冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多