java.security.NoSuchAlgorithmException: нет такого алгоритма: ECDSA для провайдера BC - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь создать пару ключей secp256k1 с помощью функции KeyPairGenerator. Моя функция выглядит как

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 ]

1 голос
/ 12 марта 2019

Я нашел это, прочитайте это.

Поддержка 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, но если вашей целью являются старые версии, вам необходимо убедиться, какой поставщик криптографии используется.

0 голосов
/ 17 апреля 2019

Этот код отлично работает для меня

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;
0 голосов
/ 12 марта 2019

Существует конфликт имен пакетов между bouncycastle и spongycastle.

Spongycastle - это перекомпилированная и протестированная версия BouncyCastle.Если вы действительно хотите использовать Bouncycastle, я думаю, что единственное решение состоит в том, чтобы включить весь исходный код bouncycastle в ваше приложение, переименовывая имена пакетов

...