Java Android:生成椭圆曲线KeypPair
我正试图实现基于椭圆曲线Diffie-Hellman的密钥生成。现在我想自己指定我的椭圆曲线,所以我取了参数 我为实现这一点而编写的代码: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
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);