Скалярное умножение на secp521r1 с использованием Crypto++
Я пишу следующий код для скалярного умножения в эллиптической кривой в C++. Код запускается, когда я не инициализирую значение точки. Но когда я делаю, это дает мне ошибку nullptr.
Я попробовал следующий код:
ECP r1;
ECPPoint basepoint = ECPPoint(2,3);
ECPPoint point;
ECPPoint s1= ecp.ScalarMultiply(basepoint, x1);
Ошибка:
CryptoPP::ECP::GetField(...) returned nullptr.
1 ответ
ОШИБКА: CryptoPP::ECP::GetField(...) вернул nullptr.
Для Crypto++ вам нужно загрузить кривую. Судя по опубликованному вами коду, это не похоже на то, что было сделано. Загрузка кривой загружает параметры домена для кривой. В случае кривой над простым полем параметры области {a,b,p,G,n,h}
, где a
а также b
коэффициенты, p
модуль, G
является базовой точкой с порядком N, n
это порядок и h
это кофактор. Вы можете увидеть их в eccrypto.cpp
,
За secp521r1
самый простой способ сделать это, вероятно, в соответствии со следующим. secp256r1
был использован, чтобы сделать вывод меньше, но вы должны использовать secp521r1
вместо.
#include "integer.h"
#include "eccrypto.h"
#include "osrng.h"
#include "oids.h"
#include <iostream>
#include <iomanip>
int main(int argc, char* argv[])
{
using namespace CryptoPP;
typedef DL_GroupParameters_EC<ECP> GroupParameters;
typedef DL_GroupParameters_EC<ECP>::Element Element;
AutoSeededRandomPool prng;
GroupParameters group;
group.Initialize(ASN1::secp256r1());
// private key
Integer x(prng, Integer::One(), group.GetMaxExponent());
std::cout << "Private exponent:" << std::endl;
std::cout << " " << std::hex << x << std::endl;
// public key
Element y = group.ExponentiateBase(x);
std::cout << "Public element:" << std::endl;
std::cout << " " << std::hex << y.x << std::endl;
std::cout << " " << std::hex << y.y << std::endl;
// element addition
Element u = group.GetCurve().Add(y, ECP::Point(2,3));
std::cout << "Add:" << std::endl;
std::cout << " " << std::hex << u.x << std::endl;
std::cout << " " << std::hex << u.y << std::endl;
// scalar multiplication
Element v = group.GetCurve().ScalarMultiply(u, Integer::Two());
std::cout << "Mult:" << std::endl;
std::cout << " " << std::hex << v.x << std::endl;
std::cout << " " << std::hex << v.y << std::endl;
return 0;
}
Скомпилируйте код с g++ test.cxx ./libcryptopp.a -o test.exe
,
Запуск кода производит:
$ ./test.exe
Private exponent:
b48e35e8d60918f815857503b034681bc59db689dee0ffc35a140e365bb056dch
Public element:
bb9c8daaace9712f368bc98cf004a4594a14f9c330e2db141906ec67f05ab8d8h
e37e5e161aae15f54f20d67b665311717305932a1479427fe063d84c5be82a1dh
Add:
f5055cd23f23f5721d8a5f6f87bd61206e972a97c19478200cb0b1f24af398ach
107a532732098c4d051efc7f54d9bda78020a6e68f95e01a33700bab56a91f9ah
Mult:
46628d3e4f43da4fd001c652682d33f608c34ce3cf6c13f45b9bd014cbb83ed4h
3b58f98bd0d70196036b77f6fcca6fe206bdf3beda4b2b604d5cb8ae0327a57ch
DL_GroupParameters_EC<ECP> group
выглядит необычно, потому что вы находитесь в низкоуровневых базовых интерфейсах. Я думаю, что именно здесь вы хотите опираться на ваш пример кода.
В общем, иерархия объектов относительно механизма ЕС показана / показана ниже. Он использует отношения "есть" или "имеет". Например, у подписавшего и расшифровщика каждый "имеет" закрытый ключ. Закрытый ключ "представляет собой" GroupParameters.
Encryptor
+- Public key
+- Group parameters
+- Curve
+- Field
Decryptor
+- Private key
+- Group parameters
+- Curve
+- Field
Verifier
+- Public key
+- Group parameters
+- Curve
+- Field
Signer
+- Private key
+- Group parameters
+- Curve
+- Field
Например, Signer - это протокол, который реализует все, что вам нужно, в одном пакете. Ниже подписавшего находится закрытый ключ, и он выполняет умножение и возведение в степень. Ниже секретного ключа находится поле и кривая. И так до тех пор, пока не дойдете до коэффициентов и модулей.
С учетом сказанного, вы обычно хотите использовать один из объектов более высокого уровня. Большинство людей используют Encryptors, Decryptors, Public Keys и Private Keys. Большинству людей не нужно опускаться ниже, например, в объекты типа GroupParameters или Curves.
Вас также могут заинтересовать Руководство по Crypto++ и Криптография с эллиптическими кривыми в вики Crypto++.