Bouncycastle在android API <21中失败

时间:2019-05-29 13:30:22

标签: android bouncycastle

我正在尝试在android中运行一些海绵宝宝代码:

    try {
        Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
        ECGenParameterSpec spec = new ECGenParameterSpec("P-256");
        KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDSA", "SC");
        generator.initialize(spec, new SecureRandom());
        KeyPair keyPair = generator.generateKeyPair();
        ECPublicKey publicKey = (ECPublicKey) keyPair.getPublic();
        ECPrivateKey privateKey = (ECPrivateKey) keyPair.getPrivate();
        String publicKeyStr = publicKey.getW().getAffineX().toString() + ":" + publicKey.getW().getAffineY().toString();
        Log.d(TAG, publicKeyStr);
        Calendar c = Calendar.getInstance();
        Date d0 = c.getTime();
        c.add(Calendar.DATE, 1);
        Date expiry = c.getTime();
        String token = Jwts.builder()
                .setIssuedAt(d0)
                .setSubject("00000000-0000-0000-0000-000000000001")
                .setExpiration(expiry)
                .signWith(privateKey, SignatureAlgorithm.ES256).compact();
        Log.d(TAG, token);
    } catch (Exception e) {
        Log.d(TAG, e.toString());
    }

在API版本21+中,它可以按预期工作。

在API版本18中,它可以在调试中工作。在发布时,其功能generator.generateKeyPair()java.lang.IllegalArgumentException: Invalid point一起失败。

在API版本16中,它在带有Jwts.builder().signWith()的函数io.jsonwebtoken.security.SignatureException: Invalid Elliptic Curve PrivateKey. can't recognise key type in ECDSA based signer中失败。

知道我在做什么错吗?

编辑:我显然已经通过从海绵堡切换到充气城堡解决了这个问题。

在我的build.gradle中,我对此进行了更改:

implementation 'com.madgag.spongycastle:core:1.58.0.0'
implementation 'com.madgag.spongycastle:prov:1.58.0.0'

对此:

implementation 'org.bouncycastle:bcpkix-jdk15on:1.60'

在我的代码中,我摆脱了这一行:

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

并添加了以下几行:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.insertProviderAt(new BouncyCastleProvider(), 1);

我将提供者从"SC"更改为"BC"

现在,我的代码可以针对所有版本的android API正常工作。

我现在关心的是此链接上的评论...

Spongy Castle: is it obsolete?

...海绵宝宝的作者:

  

为什么海绵城堡过时?

     

...

     

即使在Android 3.0之后的设备上,设备制造商也不在   粗心地捆绑图书馆,Bouncy Castle可能会   仍然捆绑在一些不起眼的设备上。

这到底是什么意思?会导致我上面的代码在某些设备上发生故障吗?

1 个答案:

答案 0 :(得分:0)

使用充气城堡:

dependencies {
    // https://mvnrepository.com/artifact/org.bouncycastle
    implementation "org.bouncycastle:bcprov-jdk15on:1.60"
    implementation "org.bouncycastle:bcpkix-jdk15on:1.60"
}