Надувной замок C #: Как мне определить кривую и точки, чтобы протестировать / поиграть с арифметикой EC point?

#c# #bouncycastle #elliptic-curve

#c# #bouncycastle #эллиптическая кривая

Вопрос:

У меня была простая библиотека EC для C #, но она исчезла, и я не могу найти ее в Интернете. Ранее он был опубликован на MSDN, но ссылка теперь недоступна.

Я пытаюсь использовать библиотеку Bouncy Castle для выполнения аналогичных задач. Я хочу создать кривую (secp256k1), и я хочу иметь возможность выполнять точечную арифметику и просматривать необработанные точечные данные.

т. е.:

G 3 * G = 4 * G

p q

4 * G — G = 3 * G

и т.д.

Какие пространства имен мне нужно включить, как мне определить / объявить кривую и как мне определить свои точки? Я успешно (я полагаю …) включил Надувной замок .dll в моем проекте C #.

Я НЕ заинтересован в создании ключей или что-то в этом роде. Просто арифметика EC point. Другая (простая) библиотека, которая позволила бы мне выполнять эти же операции, была бы так же хороша или даже лучше.

Спасибо за помощь.

РЕДАКТИРОВАТЬ: я продолжил работать над этим, и мой код выглядит следующим образом:

     private static ECDomainParameters GetCurveParameters(string name)
    {
        X9ECParameters ecP = ECNamedCurveTable.GetByName(name);

        if (ecP == null)
            throw new Exception("unknown curve name: "   name);

        return new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
    }

    private void btnTest2_Click(object sender, EventArgs e)
    {
        ECDomainParameters ecSpec = GetCurveParameters("secp256k1");
        ECCurve mycurve = ecSpec.Curve;

        ECPoint G, g2, twoG, threeG;

        G = ecSpec.G;
        g2 = ecSpec.G;

        twoG = G.Add(g2);
        threeG = G.Multiply(new BigInteger("3"));
    }
  

Теперь я могу запустить код, и я получаю значения обратно, но я не получаю правильные точки. G является правильным, но все остальные неверны.
т. е.:

 2*G or G G should =
c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5,
  1ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a

I am getting:
7d152c041ea8e1dc2191843d1fa9db55b68f88fef695e2c791d40444b365afc2,
  56915849f52cc8f76f5fd7e4bf60db4a43bf633e1b1383f85fe89164bfadcbdb
  

G * 3 также неверно.

(То, что я называю правильным, поступает из приложения PyCoin и также может быть проверено на этом веб-сайте EC arithmetics.)

Есть предложения?

Ответ №1:

Краткий ответ: Используйте ECPoint.Нормализуйте, чтобы вернуть ECPoint, координаты которой (X, Y) можно сравнить с PyCoin.

Подробности: По умолчанию (BouncyCastle) ECPoint операции выполняются в проективных координатах; в частности, то, что обычно называют «якобианскими модифицированными координатами». Это для повышения производительности при выполнении серии операций, особенно скалярного умножения. Если вы распечатаете значение, например, twoG используя предоставленный ECPoint.ToString метод, вы увидите наличие дополнительных координат.

Когда вы хотите сравнить ECPoint с некоторым значением (X, Y), вы можете вызвать ECPoint.Normalize , который возвращает новое ECPoint значение, где координата Z равна 1, а координаты X и Y являются аффинными значениями. Это относительно дорогостоящая операция, которой обычно избегают до последнего шага более масштабных вычислений.

Комментарии:

1. Это сработало отлично. Синтаксис: twoG. Normalize();