代码之家  ›  专栏  ›  技术社区  ›  K.Os

ECDSA KeyPairGenerator不可用(但在JUnit works中)

  •  0
  • K.Os  · 技术社区  · 7 年前

    我在运行Android应用程序时观察到以下异常-当我作为JUnit运行下面的代码时不会发生。

    java.security.NoSuchAlgorithmException: ECDSA KeyPairGenerator not available
        at java.security.KeyPairGenerator.getInstance(KeyPairGenerator.java:225)
        at com.mhamdaoui.smartcardreader.CryptoUtils$Companion.getMerchantEphemeralPublicKey(CryptoUtils.kt:48)
        at com.mhamdaoui.smartcardreader.MainActivity.onTagDiscovered(MainActivity.kt:80)
        at android.nfc.NfcActivityManager.onTagDiscovered(NfcActivityManager.java:603)
        at android.nfc.IAppCallback$Stub.onTransact(IAppCallback.java:83)
        at android.os.Binder.execTransact(Binder.java:573)
    

    守则:

      Security.addProvider(BouncyCastleProvider())
      val generator = KeyPairGenerator.getInstance("ECDSA")
      val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
      generator.initialize(ecSpec)
      val keyPair = generator.generateKeyPair()
      val publicKey = keyPair.public as ECPublicKey
      return publicKey.q.getEncoded(true)
    

    如何解决这个问题?

    当我在测试中创建JUnit时(我使用的是Android Studio):

    @Test
    fun compressedGeneratorTest() {
      Security.addProvider(BouncyCastleProvider())
      val generator = KeyPairGenerator.getInstance("ECDSA")
      val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
      generator.initialize(ecSpec)
      val keyPair = generator.generateKeyPair()
      val publicKey = keyPair.public as ECPublicKey
      val encoded = publicKey.q.getEncoded(true)
      assert(true)
    }
    

    一切都很好。如何在应用程序运行时解决此问题?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    问题是在Android上不可能使用BounceyCastle-而是使用SpongyCastle:

    implementation 'com.madgag.spongycastle:prov:1.54.0.0'
    implementation 'com.madgag.spongycastle:pkix:1.54.0.0'
    

    Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider())
    
        2
  •  0
  •   Mahendran Sakkarai Nainal    5 年前

    最新版本的BouncyCastle库可用于使用 ECDSA

    通过添加以下依赖项,包括最新的bouncy castle库。

        implementation "org.bouncycastle:bcprov-jdk15to18:1.68"
        implementation "org.bouncycastle:bcpkix-jdk15to18:1.68"
    

    注:请参阅 Provider , PKIX

    添加库之后,根据所提到的需要,遵循下面提到的任何方法。

    方法1

    如果要在整个应用程序级别使用提供程序,请使用下面的行将Android OS Bouncycastle提供程序替换为添加库中的提供程序。

    // Remove the OS provided bouncy castle provider
    Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)
    // Add the bouncy castle provider from the added library
    Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider())
    

    方法2

    KeyPairGenerator 如下图所示。

    KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDSA", new org.bouncycastle.jce.provider.BouncyCastleProvider())
    

    科特林

    val generator = KeyPairGenerator.getInstance("ECDSA", org.bouncycastle.jce.provider.BouncyCastleProvider())