Ошибка при реализации диффи-хеллмана с эллиптической кривой в Java

Я скопировал код с http://www.java2s.com/Tutorial/Java/0490__Security/DiffieHellmanwithEllipticCurve.htm

Вот мой код..

 import java.math.BigInteger;
 import java.security.KeyPair;
 import java.security.KeyPairGenerator;
 import java.security.MessageDigest;
 import java.security.SecureRandom;
 import java.security.Security;
 import java.security.spec.ECFieldFp;
 import java.security.spec.ECParameterSpec;
 import java.security.spec.ECPoint;
 import java.security.spec.EllipticCurve;
 import javax.crypto.KeyAgreement;

      public class MainClass {
        public static void main(String[] args) throws Exception {
     Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDH", "BC");
EllipticCurve curve = new EllipticCurve(new ECFieldFp(new BigInteger(
    "fffffffffffffffffffffffffffffffeffffffffffffffff", 16)), new BigInteger(
    "fffffffffffffffffffffffffffffffefffffffffffffffc", 16), new BigInteger(
    "fffffffffffffffffffffffffffffffefffffffffffffffc", 16));

ECParameterSpec ecSpec = new ECParameterSpec(curve, new ECPoint(new BigInteger(
    "fffffffffffffffffffffffffffffffefffffffffffffffc", 16), new BigInteger(
    "fffffffffffffffffffffffffffffffefffffffffffffffc", 16)), new BigInteger(
    "fffffffffffffffffffffffffffffffefffffffffffffffc", 16), 1);

keyGen.initialize(ecSpec, new SecureRandom());

KeyAgreement aKeyAgree = KeyAgreement.getInstance("ECDH", "BC");
KeyPair aPair = keyGen.generateKeyPair();
KeyAgreement bKeyAgree = KeyAgreement.getInstance("ECDH", "BC");
KeyPair bPair = keyGen.generateKeyPair();

aKeyAgree.init(aPair.getPrivate());
bKeyAgree.init(bPair.getPrivate());

aKeyAgree.doPhase(bPair.getPublic(), true);
bKeyAgree.doPhase(aPair.getPublic(), true);

MessageDigest hash = MessageDigest.getInstance("SHA1", "BC");

System.out.println(new String(hash.digest(aKeyAgree.generateSecret())));
System.out.println(new String(hash.digest(bKeyAgree.generateSecret())));
}
}

но это дает мне следующую ошибку:

  Exception in thread "main" java.lang.IllegalArgumentException: Invalid point
at org.bouncycastle.math.ec.ECAlgorithms.validatePoint(Unknown Source)
at org.bouncycastle.math.ec.AbstractECMultiplier.multiply(Unknown Source)
at org.bouncycastle.crypto.generators.ECKeyPairGenerator.generateKeyPair(Unknown Source)
at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi$EC.generateKeyPair(Unknown Source)
at MainClass.main(MainClass.java:32)

Не могли бы вы мне помочь? Я искал, но пока не нашел решения. Большое спасибо!


person Sangeen Khan    schedule 11.05.2016    source источник
comment
вам нужно сначала добавить банку надувного замка   -  person Sangeen Khan    schedule 11.05.2016
comment
Я добавил не ту банку (jdk 1.4). Теперь, когда я добавил банку для 1.5, у меня та же ошибка.   -  person Leo    schedule 11.05.2016
comment
Вы скопировали/вставили код или переписали его?   -  person Zymus    schedule 11.05.2016
comment
я скопировал из ссылки   -  person Sangeen Khan    schedule 13.05.2016


Ответы (1)


Попробуйте эту версию здесь

http://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16/1.46

По крайней мере, он не возвращает исключение (однако сгенерированная строка выглядит неправильно)

person Leo    schedule 11.05.2016