使用Crypto ++在secp521r1上进行标量乘法

时间:2019-05-23 11:01:01

标签: c++ cryptography crypto++ elliptic-curve

我正在为c + +编写以下代码在椭圆曲线中进行标量乘法。当我不初始化该点的值时,代码将运行。但是当我这样做时,它给了我nullptr错误。

我尝试了以下代码:

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

错误:

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

1 个答案:

答案 0 :(得分:0)

  

错误:CryptoPP :: ECP :: GetField(...)返回了nullptr。

对于Crypto ++,您需要加载一条曲线。根据您发布的代码,它看起来还没有完成。加载曲线将加载曲线的域参数。如果是素数场上的曲线,则域参数为 {a,b,p,G,n,h} ,其中 a b < / em>是系数, p 模量, G 是基序, N { {1}} 是顺序, n 是辅助因子。您可以在eccrypto.cpp中看到它们。

对于h,最简单的方法可能是遵循以下内容。 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 看起来很不寻常,因为您进入了较低级别的基本接口。我认为这就是您要基于示例代码的地方。

通常,与EC齿轮有关的对象层次如下所示。它同时使用“是”或“具有”关系。例如,签名者和解密者各自“具有”私钥。私钥“是一个” GroupParameters。

DL_GroupParameters_EC<ECP> group

例如,签名者是协议,它在单个程序包中实现您需要的所有内容。签名者下方是私钥,它执行乘法和求幂。私钥下方是字段和曲线。依此类推,直到获得系数和模数为止。

话虽如此,您通常希望使用更高级别的对象之一。大多数人都使用加密器,解密器,公钥和私钥。大多数人不需要进入下方,例如进入GroupParameters或Curves之类的对象。


您可能还对Crypto ++ Wiki中的Crypto++ ManualElliptic Curve Cryptography感兴趣。