NoneCurve 25519 умножение базовой точки с использованием Crypto++

Когда мы умножаем базовую точку curve25519 со скалярным числом выдается исключение.

Integer gx(group.GetSubgroupGenerator().x);

Integer gy(group.GetSubgroupGenerator().y);

ECP::Point g(gx, gy);

ECP::Point P(group.GetCurve().ScalarMultiply(g, 3));

Exception thrown at 0x005B4412 in CryptoExample.exe: 0xC0000005: Access violation reading location 0x00000000.

Как мы можем взять генератор, отличный от базовой точки на этой кривой?

1 ответ

Решение
Integer gx(group.GetSubgroupGenerator().x);

Integer gy(group.GetSubgroupGenerator().y);

ECP::Point g(gx, gy);

ECP::Point P(group.GetCurve().ScalarMultiply(g, 3));

group.GetCurve() скорее всего возвращается NULL потому что ни одна кривая не была установлена. Но механизм кривой 25519, вероятно, не будет работать правильно, используя стандартный способ работы (как показано в разделе Скалярное умножение на secp521r1 с использованием Crypto++). На самом деле, если вы запустите следующий код:

GroupParameters group;
group.Initialize(ASN1::X25519());

Тогда код приведет к исключению, потому что параметры домена отсутствуют в eccrypto.h а также eccrypto.cpp:

$ ./test.exe
terminate called after throwing an instance of 'CryptoPP::UnknownOID'
  what():  BER decode error: unknown object identifier

Механизм кривой25519 специально для Crypto++. Вместо того, чтобы использовать основную библиотеку Integer класс и типовые полевые операции через GroupParameters объект, он использует постоянную реализацию времени от Эндрю Муна по имени Донна. Затем библиотека оборачивает код Moonna Moon и обеспечивает наиболее ожидаемую работу с использованием объектов Crypto++, таких как PK_Signer а также PK_Verifier,

Однако "... и обеспечивает наиболее ожидаемую операцию" останавливается именно на объектах нижнего уровня, таких как DL_GroupParameters_EC, который является интерфейсом, который вы пытаетесь использовать.

Вы также можете взглянуть на функции, доступные в donna.h:

int curve25519_mult (byte publicKey[32], const byte secretKey[32])
    Generate a public key. More...

int curve25519_mult (byte sharedKey[32], const byte secretKey[32], const byte othersKey[32])
    Generate a shared key. More...

Это те скалярные умножения, которые вы ищете. Первый curve25519_mult использует базовую точку 9. Второе curve25519_mult позволяет указать произвольную базовую точку.

donna.h должен быть частным заголовком, но мы должны были выставить его из-за отсутствия операций кривой. Тем не менее, Донна до сих пор не хватает функций для Add а также Double хотя они, вероятно, могут быть экспортированы в случае необходимости.

А также увидеть x25519 а также ed25519 на Crypto++ вики; и скалярное умножение на secp521r1 с использованием Crypto++ в переполнении стека.


x25519 а также ed25519 Вики-страницы действительно обсуждают вашу проблему:

Библиотека Crypto++ использует постоянное время Эндрю Муна ed25519-donna. Механизм curve25519, похоже, похож на большинство других сопоставимых объектов открытого ключа в библиотеке Crypto++, но в основном это фасад. Классы Crypto++ - это просто обертки вокруг кода Moon, которые представляют ожидаемый интерфейс для вызывающих. Побочным эффектом интеграции является отсутствие общих параметров Point, Curve или GroupParameters, поэтому вы не можете выполнять произвольные вычисления с помощью кривой25519.


Причина, по которой кривая 25519 является особенной, заключается в том, что нам нужно было предоставить передачу, но мы хотели избежать множества изменений, необходимых для ее правильной поддержки. Библиотека хорошо поддерживает короткие кривые Вейерштрасса, но почти не поддерживает кривые Эдвардса и Скрученного Эдварда.

В конце концов кривая 25519 будет правильно добавлена ​​в библиотеку.

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