Ваш пример не имеет никакого смысла, поэтому трудно понять, каким, по вашему мнению, должен быть результат. Используя низкоуровневые классы, такие как ECFieldElement
, вы берете на себя полную ответственность за предоставление разумных параметров. Вы выбрали кривую NIST P-224. Эта эллиптическая кривая определяется над конкретным полем. Вы можете извлечь простое число «q» для этого конечного поля и использовать его для создания элементов поля следующим образом (в отличие от вашего примера):
X9ECParameters x9 = NISTNamedCurves.getByName("P-224");
ECCurve.Fp curve = (Fp) x9.getCurve();
BigInteger q = curve.getQ();
ECFieldElement x1 = new ECFieldElement.Fp(q, new BigInteger("8"));
ECFieldElement y1 = new ECFieldElement.Fp(q, new BigInteger("9"));
Первый аргумент конструктора ECFieldElement.Fp
- это простое число, определяющее поле.
Вторая проблема в вашем примере состоит в том, что не каждая пара (x, y) целых чисел является точкой на эллиптической кривой. Вероятность случайного попадания (x, y) на P-224 невероятно мала. Здесь снова, возиться с низкоуровневыми классами EPoint Bouncycastle не проверяет это для вас. Таким образом, хотя вы можете настроить механизм программного обеспечения для добавления эллиптических кривых и дать вам ответы, эти ответы не имеют смысла.
Чтобы добиться большего прогресса, я должен сначала спросить: что вы пытаетесь сделать?
РЕДАКТИРОВАТЬ:
Есть два основных способа найти точку на эллиптической кривой.
- взять существующую известную точку на кривой и умножить скаляр на целое число. Результат - еще одна точка на кривой.
- Выберите x-координату, скажем, x1. Вставьте его в правую часть формулы эллиптической кривой , чтобы y1 ^ 2 = E (x1). Затем попытайтесь вычислить квадратный корень в поле. Если квадратный корень существует, то вы получите две точки (x1, y1) и (x1, -y1), которые находятся на кривой. Если квадратный корень не существует, то на кривой нет точки с координатой x1.
Вы можете получить точку на своей эллиптической кривой на ECPoint.Fp = (ECPoint.Fp)x9.getG();
. Вы можете умножить эту точку на целое число с ECPoint.multiply(...)
.
Использовать метод № 2 сложнее, чем нужно с Bouncycastle. Все методы находятся в классах ECPoint и ECFieldElement. Класс ECFieldElement содержит метод открытого квадратного корня, который можно использовать для попытки вычисления квадратного корня. Если он возвращает ноль, то квадратный корень не существует.