Получите X-координату эллиптической кривой, используя Bouncy Castle - PullRequest
0 голосов
/ 27 ноября 2018

Я попытался вычислить операцию Tr (x) для координаты x эллиптической кривой F2m (m = 163).Для этого я использовал «Надувной замок» с соответствующими типами.Трасса для моей эллиптической кривой равна 0 или 1, и мой код следующий:

public int CalculateTrace_Test(byte[] array)
{
    int m = 163;            
    BigInteger two = new BigInteger("2", 10);
    BigInteger x = new BigInteger(array);
    BigInteger xi = x;
    BigInteger temp = x;
    for (int i = 1; i < m; i++)
    {
        var next = xi.ModPow(two.Pow(i), fx);
        temp = temp.Xor(next);
    }

    return temp.IntValue;
}

Здесь fx - целое число, образованное из неприводимого полинома f(x) = x^163+x^7+x^6+x^3 + 1.

Так что мойпроблема в том, что он не работает и, как результат, у меня есть все, но не 1 или 0. Может ли кто-нибудь сказать мне, что не так в моей реализации трассировки?

1 Ответ

0 голосов
/ 27 ноября 2018

Не похоже, что вы правильно выполняете арифметику в GF (2 m ).Классы, которые поддерживают правильную арифметику полей, находятся в пакете org.bouncycastle.math.ec.Взгляните на ECFieldElement.F2m и ECCurve.F2m.Кроме того, для вашего конкретного случая, который соответствует полиному сокращения SECT163, класс SecT163FieldElement может быть особенно полезным.

Здесь некоторый код скопирован непосредственно из класса org.bouncycastle.math.ec.tools.TraceOptimizer.Код предполагает, что конечное поле имеет характеристику 2.

private static int calculateTrace(ECFieldElement fe) {
    int m = fe.getFieldSize();
    ECFieldElement tr = fe;
    for (int i = 1; i < m; ++i) {
        fe = fe.square();
        tr = tr.add(fe);
    }
    BigInteger b = tr.toBigInteger();
    if (b.bitLength() > 1) {
        throw new IllegalStateException();
    }
    return b.intValue();
...