java.security.NoSuchAlgorithmException:无此类算法:提供者BC的ECDSA

时间:2019-03-12 13:55:59

标签: android kotlin bouncycastle spongycastle

我正在尝试使用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提供程序。

3 个答案:

答案 0 :(得分:1)

我找到了,读了。

从4.0版开始,使用Bouncycastle(v1.46)作为默认加密提供程序,引入了对ECDSA的Android支持。参见博客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版本中解决,但是如果您的目标是旧版本,则需要确保正在使用哪个加密提供程序。

答案 1 :(得分:0)

在Bouncycastle和spongycastle之间有一个程序包名称冲突。

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

答案 2 :(得分:0)

此代码对我来说很好

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;