我正在尝试实现基于椭圆曲线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();
}
}
此时,代码编译。然而,它在必须生成KeyPair的try_catch块中失败了。
错误消息是:
无法创建ECKeyFactory:未处理的字段类java.security. spec.ECFieldF2m
有人有这个问题吗?我怎么解决这个问题?
我没有遇到你遇到的同样的问题,但是因为你在Android系统中使用EC,并且有一个奇怪的运行异常,我会给你我的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)中,我得到了完全相同的例外。
对我来说,解决这个问题的方法是改变我添加海绵城堡的方式,并这样做:
Security.insertProviderAt(new BouncyCastleProvider(), 1);