Java Android:生成椭圆曲线KeypPair

Java Android:生成椭圆曲线KeypPair,java,android,cryptography,bouncycastle,Java,Android,Cryptography,Bouncycastle,我正试图实现基于椭圆曲线Diffie-Hellman的密钥生成。现在我想自己指定我的椭圆曲线,所以我取了参数 我为实现这一点而编写的代码: public void createKey(){ // base point (generator???) BigInteger x = new BigInteger("2fe13c0537bbc11acaa07d793de4e6d5e5c94eee8", 16); BigInteger y = new Bi

我正试图实现基于椭圆曲线Diffie-Hellman的密钥生成。现在我想自己指定我的椭圆曲线,所以我取了参数

我为实现这一点而编写的代码:

public void createKey(){

        // base point (generator???)
        BigInteger x = new BigInteger("2fe13c0537bbc11acaa07d793de4e6d5e5c94eee8", 16);
        BigInteger y = new BigInteger("289070fb05d38ff58321f2e800536d538ccdaa3d9", 16);

        // the order of generator
        BigInteger n = new BigInteger("5846006549323611672814741753598448348329118574063", 10);

        // curves coefficients
        BigInteger ab = new BigInteger("1", 2);

        // curves cofactor
        BigInteger h = new BigInteger("2", 10);

        // exponents of the equotation
        int[] ks = {7, 6, 3};

        ECFieldF2m ecField = new ECFieldF2m(163, ks);
        // Elliptic curve
        EllipticCurve ec = new EllipticCurve(ecField, ab, ab);

        // GENERATOR POINT
        ECPoint g = new ECPoint(x, y);

        // Parameter specs?
        ECParameterSpec ecps = new ECParameterSpec(ec , g , n, h.intValue());

    try {
        // get keypair
        KeyPairGenerator kg = KeyPairGenerator.getInstance("ECDSA");
        kg.initialize(ecps, new SecureRandom());
        KeyPair kp = kg.generateKeyPair();
        Log.d("SECLIENT"+type,kp.getPublic().toString());
        Log.d("SECLIENT"+type,kp.getPrivate().toString());
    }catch (Exception e){
        e.printStackTrace();
    }
}
此时,代码将编译。但是,它在try_catch块中失败,在该块中它必须生成密钥对

错误消息是:

java.lang.RuntimeException:无法创建EC KeyFactory:未处理的字段类java.security.spec.ECFieldF2m


有人有这个问题吗?我该如何解决这个问题呢?

我没有遇到与您完全相同的问题,但是由于您在Android中使用EC,并且出现了一个奇怪的运行时异常,我将留给您我的2美分。希望能有帮助

我又犯了一个奇怪的错误(与OEM相关)

在尝试使用

KeyAgreement.getInstance("ECDH);
发生在我身上的事情是,我添加了
SpongyCastle
作为
SecurityProvider
,这样做:

Security.addProvider(new BouncyCastleProvider());
对于某些设备,一切正常,但在另一些设备(即LGE Nexus 5),我得到了完全相同的例外

对我来说,解决这个问题的方法是改变我添加SpongyCastle的方式,并进行以下操作:

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

你试过Fp曲线吗?还是这超出了要求?哦,欢迎来到,一开始就有个问题。还有,你为什么说你在尝试Diffie Hellman?您正在使用用于数字签名的“ECDSA”。Diffie Hellman用于安全密钥交换。
Security.insertProviderAt(new BouncyCastleProvider(), 1);