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