Реализация добавления очков 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 ;
}