Скалярное умножение на secp521r1 с использованием Crypto ++ - PullRequest
1 голос
/ 23 мая 2019

Я пишу следующий код для скалярного умножения в эллиптической кривой в C ++. Код запускается, когда я не инициализирую значение точки. Но когда я это сделаю, это выдаст мне ошибку nullptr.

Я попробовал следующий код:

ECP r1;
ECPPoint basepoint = ECPPoint(2,3);
ECPPoint point;
ECPPoint s1= ecp.ScalarMultiply(basepoint, x1);

Ошибка:

CryptoPP::ECP::GetField(...) returned nullptr.

1 Ответ

0 голосов
/ 23 мая 2019

ОШИБКА: 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 ++ Manual и Криптография с эллиптическими кривыми в вики Crypto ++.

...