【问题标题】:Android: Generating Elliptic Curve KeypPairAndroid:生成椭圆曲线KeypPair
【发布时间】:2016-06-14 16:12:23
【问题描述】:

我正在尝试基于椭圆曲线 Diffie Hellman 实现密钥生成。现在我想自己指定我的椭圆曲线,所以我把参数from here.

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

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: Unable to create EC KeyFactory: unhandled field class java.security.spec.ECFieldF2m

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

【问题讨论】:

  • 你试过Fp曲线吗?或者这是外部要求?哦,欢迎来到 SO,这是一个开始的问题。

标签: java android cryptography bouncycastle


【解决方案1】:

我没有遇到您遇到的完全相同的问题,但是由于您在 Android 中使用 EC 并且遇到了奇怪的 RuntimeException,所以我会给您 2 美分。希望对您有所帮助。

我遇到了另一个奇怪的错误(与 OEM 相关)

java.lang.RuntimeException: error:0f06707b:elliptic curve routines:EC_GROUP_new_by_curve_name:UNKNOWN_GROUP

尝试使用时

KeyAgreement.getInstance("ECDH);

发生在我身上的是我将SpongyCastle 添加为SecurityProvider,这样做:

Security.addProvider(new BouncyCastleProvider());

对于某些设备,一切都按预期工作,但在其他设备(即 LGE Nexus 5)中,我遇到了完全相同的异常。

为我解决的问题是改变了我添加 SpongyCastle 的方式:

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

【讨论】:

  • 另外,你为什么说你在尝试 Diffie-Hellman?您正在使用用于数字签名的 "ECDSA"。 Diffie-Hellman 用于安全密钥交换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2013-11-14
  • 2018-05-20
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多