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 будет правильно добавлена в библиотеку.