从字符串中检索键时,flexiprovider 与 bouncycastle 发生冲突
flexiprovider conflicts with bouncycastle when retrieving keys from string
一段时间以来,我一直在使用下面提供的解决方案 encrypt/decrypt 使用 Flexiprovider。该解决方案适用于 galaxy s5 和 s6。但是,在 s9 中它不起作用,因为它与 BouncyCastle 冲突。
适用于 s5 和 s6 的代码:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECIES", "FlexiEC");
CurveParams ecParams = new CurveRegistry.BrainpoolP512r1();
kpg.initialize(ecParams, new SecureRandom());
KeyPair keyPair = kpg.generateKeyPair();
PublicKey pubKey = keyPair.getPublic();
PrivateKey privKey = keyPair.getPrivate();
String STRpubKey = Base64.encodeToString(pubKey.getEncoded(),
Base64.DEFAULT);
byte[] decodedPublicKey = Base64.decode(STRpubKey, Base64.DEFAULT);
X509EncodedKeySpec X509spec = new X509EncodedKeySpec(decodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("ECIES","FlexiEC");
PublicKey pubkey = keyFactory.generatePublic(X509spec);
以上代码在s9中出现如下错误:
java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'com.android.org.bouncycastle.math.ec.ECCurve com.android.org.bouncycastle.asn1.x9.X9ECParameters.getCurve()' on a null object reference
异常发生在这里:
PublicKey pubkey = keyFactory.generatePublic(X509spec);
此问题是由于 Android-supplied "BC" 提供商不支持 Brainpool 曲线造成的。一种解决方法是删除 Android-supplied BC 提供程序并安装您自己的支持这些曲线的 BC 提供程序副本。例如,我在我的 Android Studio 项目中添加了对最新的 bouncycastle jar bcprov-jdk15on-161.jar
的 jar 依赖项,并在执行您的示例代码之前添加了以下代码行:
Security.removeProvider("BC");
Security.addProvider(new BouncyCastleProvider());
Security.addProvider(new FlexiECProvider());
并且代码运行没有抛出异常。您也可以考虑使用不太模糊的曲线,例如 secp256r1
.
一段时间以来,我一直在使用下面提供的解决方案 encrypt/decrypt 使用 Flexiprovider。该解决方案适用于 galaxy s5 和 s6。但是,在 s9 中它不起作用,因为它与 BouncyCastle 冲突。 适用于 s5 和 s6 的代码:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECIES", "FlexiEC");
CurveParams ecParams = new CurveRegistry.BrainpoolP512r1();
kpg.initialize(ecParams, new SecureRandom());
KeyPair keyPair = kpg.generateKeyPair();
PublicKey pubKey = keyPair.getPublic();
PrivateKey privKey = keyPair.getPrivate();
String STRpubKey = Base64.encodeToString(pubKey.getEncoded(),
Base64.DEFAULT);
byte[] decodedPublicKey = Base64.decode(STRpubKey, Base64.DEFAULT);
X509EncodedKeySpec X509spec = new X509EncodedKeySpec(decodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("ECIES","FlexiEC");
PublicKey pubkey = keyFactory.generatePublic(X509spec);
以上代码在s9中出现如下错误:
java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'com.android.org.bouncycastle.math.ec.ECCurve com.android.org.bouncycastle.asn1.x9.X9ECParameters.getCurve()' on a null object reference
异常发生在这里:
PublicKey pubkey = keyFactory.generatePublic(X509spec);
此问题是由于 Android-supplied "BC" 提供商不支持 Brainpool 曲线造成的。一种解决方法是删除 Android-supplied BC 提供程序并安装您自己的支持这些曲线的 BC 提供程序副本。例如,我在我的 Android Studio 项目中添加了对最新的 bouncycastle jar bcprov-jdk15on-161.jar
的 jar 依赖项,并在执行您的示例代码之前添加了以下代码行:
Security.removeProvider("BC");
Security.addProvider(new BouncyCastleProvider());
Security.addProvider(new FlexiECProvider());
并且代码运行没有抛出异常。您也可以考虑使用不太模糊的曲线,例如 secp256r1
.