Реализация добавления очков ed448, похоже, не работает

Я пытаюсь реализовать ed448 на C++, но мое добавление точки, похоже, не работает. Может ли кто-нибудь помочь мне определить проблему?

Вот функция

          mpz_class A(m_Z * other.m_Z);
    mpz_class B(A * A);
    mpz_class C(m_X * other.m_X);
    mpz_class D(m_Y * other.m_Y);

    mpz_class E(nsSignature::Ed448::_d * C * D);
    mpz_class F(B - E);
    mpz_class G(B + E);
    mpz_class H((m_X + m_Y)*(other.m_X + other.m_Y));

    m_X = ((A * F * (H - C - D)) % nsSignature::Ed448::_p);
    m_Y = ((A * G * (D - C)) % nsSignature::Ed448::_p);
    m_Z = ((F * G) % nsSignature::Ed448::_p);

    if(m_X < 0) m_X += nsSignature::Ed448::_p;
    if(m_Y < 0) m_Y += nsSignature::Ed448::_p;
    if(m_Z < 0) m_Z += nsSignature::Ed448::_p;

значение nsSignature::Ed448::_p является 726838724295606890549323807888004534353641360687318060281490199180612328166730772686396383698676545930088884461843637361053498018365439

      (i.e $2^{448} - 2^{224} - 1$)

Я получаю настоящие x и y вот так

          mpz_class invZ;
    mpz_invert(invZ.get_mpz_t(), m_Z.get_mpz_t(), nsSignature::Ed448::_p.get_mpz_t());
    mpz_class x((m_X * invZ) % nsSignature::Ed448::_p);
    if(x < 0)
        x += nsSignature::Ed448::_p;
    return x;

(то же самое для Y) И я не получаю того же результата, что и библиотека ecpy

Вот метод умножения точки:

          mul %= nsSignature::Ed448::_L;

    nsEllipticCurve::Ed448EllipticCurvePoint P = *this;
    *this = nsSignature::Ed448::NEUTRAL_ELEMENT;

    while(mul > 0)
    {
        if(mul % 2 == 1)
            this->add(P);
        P.add(P);
        mul >>= 1 ;
    }

0 ответов

Другие вопросы по тегам