Шифрование эллиптической кривой - PullRequest
0 голосов
/ 11 июля 2011

Пожалуйста, предоставьте мне пример использования библиотеки Bouncycastle, показывающий, как добавить две точки на эллиптической кривой.

Я попробовал следующий код, но я не получил тот же результат, который должен был произойти теоретически.

   X9ECParameters x9=NISTNamedCurves.getByName("P-224");
   ECCurve curve=x9.getCurve();
   ECFieldElement x1=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("8"));
   ECFieldElement y1=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("9"));
   ECPoint.Fp p1=new ECPoint.Fp(curve, x1, y1);
   ECFieldElement x2=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("5"));
   ECFieldElement y2=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("6"));
   ECPoint.Fp p2=new ECPoint.Fp(curve, x2, y2);
   p2=(ECPoint.Fp) p1.add(p2);
   System.out.println(p2.getX().toBigInteger()+" "+p2.getY().toBigInteger());

А также я не понял, какое значение предоставить для первых BigInteger в ECFiledElement.

1 Ответ

5 голосов
/ 12 июля 2011

Ваш пример не имеет никакого смысла, поэтому трудно понять, каким, по вашему мнению, должен быть результат. Используя низкоуровневые классы, такие как 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 не проверяет это для вас. Таким образом, хотя вы можете настроить механизм программного обеспечения для добавления эллиптических кривых и дать вам ответы, эти ответы не имеют смысла.

Чтобы добиться большего прогресса, я должен сначала спросить: что вы пытаетесь сделать?

РЕДАКТИРОВАТЬ:

Есть два основных способа найти точку на эллиптической кривой.

  1. взять существующую известную точку на кривой и умножить скаляр на целое число. Результат - еще одна точка на кривой.
  2. Выберите x-координату, скажем, x1. Вставьте его в правую часть формулы эллиптической кривой , чтобы y1 ^ 2 = E (x1). Затем попытайтесь вычислить квадратный корень в поле. Если квадратный корень существует, то вы получите две точки (x1, y1) и (x1, -y1), которые находятся на кривой. Если квадратный корень не существует, то на кривой нет точки с координатой x1.

Вы можете получить точку на своей эллиптической кривой на ECPoint.Fp = (ECPoint.Fp)x9.getG();. Вы можете умножить эту точку на целое число с ECPoint.multiply(...).

Использовать метод № 2 сложнее, чем нужно с Bouncycastle. Все методы находятся в классах ECPoint и ECFieldElement. Класс ECFieldElement содержит метод открытого квадратного корня, который можно использовать для попытки вычисления квадратного корня. Если он возвращает ноль, то квадратный корень не существует.

...