BouncyCastle проверяет генерацию открытого ключа secp256k1 - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть следующий Java-код, использующий библиотеку bounce castle:

byte[] privKey = new byte[32];
privKey[31] = 1;


ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256k1");
ECPoint pointQ = spec.getG().multiply(new BigInteger(1, privKey));

System.out.println(pointQ.getRawXCoord());
System.out.println(pointQ.getRawYCoord());

Чтобы убедиться, что я хотел проверить вычисленные значения X и Y в качестве тестового вектора secp256k1.https://chuckbatson.wordpress.com/2014/11/26/secp256k1-test-vectors/

Это работает только для k = 1.

Но когда я использую k = 2, как в

byte[] privKey = new byte[32];
privKey[31] = 2;

, я получаю совершенно разные значения для X и YЯ что-то здесь не так делаю?

1 Ответ

0 голосов
/ 20 декабря 2018

Для ускорения расчетов ECC мы используем проективную систему координат.В этом случае точка представлена ​​3 числами: X, Y, Z. В вашем коде вы получаете проективные координаты, и поэтому X, Y не соответствует аффинным координатам из тестовых векторов.

Вы должнынормализуйте свою точку зрения, чтобы получить аффинные X и Y:

byte[] privKey = new byte[32];
privKey[31] = 2;

ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256k1");
ECPoint pointQ = spec.getG().multiply(new BigInteger(1, privKey));

pointQ = pointQ.normalize();

System.out.println(pointQ.getRawXCoord());
System.out.println(pointQ.getRawYCoord());
...