3

我正在尝试将 BouncyCastle 与 android 一起使用来实现 ECDH 和 EL Gamal。我添加了 bouncycastle jar 文件(bcprov-jdk16-144.jar)并编写了一些适用于我的计算机 jvm 的代码,但是当我尝试将其移植到我的 android 应用程序时,它会抛出:

java.security.NoSuchAlgorithmException: KeyPairGenerator ECDH implementation not found

代码示例如下:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

java.security.KeyPairGenerator keyGen = org.bouncycastle.jce.provider.asymmetric.ec.KeyPairGenerator.getInstance("ECDH", "BC");
                ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1");

                keyGen.initialize(ecSpec, SecureRandom.getInstance("SHA1PRNG"));



                KeyPair pair = keyGen.generateKeyPair();
                PublicKey pubk = pair.getPublic();
                PrivateKey prik = pair.getPrivate();

然后我编写了一个简单的程序来查看可用的加密算法并在我的 android 模拟器和我的计算机 jvm 上运行它,代码是:

Set<Provider.Service> rar = new org.bouncycastle.jce.provider.BouncyCastleProvider().getServices();
    Iterator<Provider.Service> ir = rar.iterator();
    while(ir.hasNext())
        System.out.println(ir.next().getAlgorithm());

在 android 上,我在计算机上正常运行时没有得到任何 EC 算法,这很好。

在为许多充气城堡类进行编译时,我也遇到了以下两个错误:

01-07 17:17:42.548: INFO/dalvikvm(1054): DexOpt: 不解决模棱两可的类 'Lorg/bouncycastle/asn1/ASN1Encodable;'

01-07 17:17:42.548: DEBUG/dalvikvm(1054): DexOpt: 不验证 'Lorg/bouncycastle/asn1/ess/OtherSigningCertificate;': 多个定义

我究竟做错了什么?

4

3 回答 3

9

您可能想要Spongy Castle - 我为 Bouncy Castle 制作的一个重新包装,专门针对 Android。如此处所述:

http://code.google.com/p/android/issues/detail?id=3280

...不幸的是,Android 平台包含了 Bouncy Castle 的精简版本,由于类加载器冲突,这也使得安装库的更新版本变得困难 - 即使添加完整的 BC jar,您也不会获得额外的类你补充说。

Spongy Castle 完全替代了 Android 附带的 Bouncy Castle 加密库的残缺版本。有几个小改动可以让它在 Android 上运行:

  • 所有包名都从 org.bouncycastle.* 移到 org.spongycastle.* - 所以没有类加载器冲突
  • Java Security API Provider 名称现在是SC而不是BC
于 2011-07-14T13:56:06.833 回答
1

如果您浏览 Android 代码,您会看到并非所有 BouncyCastle 功能都包含在内。见 libcore/security/src/main/java/org/bouncycastle/jce/provider/BouncyCastleProvider.java

特别是 ECDH 的输出被注释掉了,这意味着在编译时它将完全从 android jar 文件中排除。

于 2010-11-19T15:03:10.277 回答
1

我不知道这是否回答了您的问题,但一些 BouncyCastle 库已经在 Android SDK 中。模糊类的错误可能是因为 BouncyCastle 已经包含在模拟器中。

看来您可以通过javax.crypto.Cipher 类使用它。

于 2010-01-08T01:29:01.857 回答