我在 CryptoPP 上翻来覆去,找不到这个特定问题的答案。这是示例源代码(部分)
AutoSeededRandomPool prng;
//Generate a private key
ECDSA<ECP, CryptoPP::SHA256>::PrivateKey privateKey;
privateKey.Initialize(prng, CryptoPP::ASN1::secp256r1());
// Generate publicKey
ECDSA<ECP, CryptoPP::SHA256>::PublicKey publicKey;
privateKey.MakePublicKey(publicKey);
// Extract Component values
Integer p = privateKey.GetGroupParameters().GetCurve().GetField().GetModulus();
Integer a = privateKey.GetGroupParameters().GetCurve().GetA();
Integer b = privateKey.GetGroupParameters().GetCurve().GetB();
Integer Gx = privateKey.GetGroupParameters().GetSubgroupGenerator().x;
Integer Gy = privateKey.GetGroupParameters().GetSubgroupGenerator().y;
Integer n = privateKey.GetGroupParameters().GetSubgroupOrder();
Integer h = privateKey.GetGroupParameters().GetCofactor();
Integer Qx = publicKey.GetPublicElement().x;
Integer Qy = publicKey.GetPublicElement().y;
Integer x = privateKey.GetPrivateExponent();
// Construct Point elelemt;
ECP curve(p,a,b);
ECP::Point G(Gx,Gy);
ECP::Point Q(Qx,Qy);
//Build publicKey using elements (no point compression)
ECDSA<ECP, CryptoPP::SHA256>::PublicKey GeneratedPublicKey;
GeneratedPublicKey.Initialize(curve,G,n,Q);
assert(GeneratedPublicKey.Validate(prng, 3));
//Build publicKey using elements (with point compression)?
通过这种方式,我可以使用组件值生成 publicKey。但是,我不能让它与点压缩一起工作——这意味着我没有 Qy 值——有没有办法做到这一点?Initialize 方法有两个重载,但都不是针对点压缩的情况。
我的问题是关于“PublicKey.Initialize(curve,G,n,Q)”的 Crypto++ 的具体问题。由于我无法使用当前项目传输整个 publicKey - 我被迫将域参数指定为索引值并且只能传输 Qx 值。所以我应该使用“PublicKey.Initialize(curve,G,n,Q)”之类的东西来初始化 publicKey 但是,我找不到这样的关于点压缩的初始化 API。
所以,这不是关于“如何进行点压缩”,而是“有没有办法在没有 Qy 值的情况下初始化公钥?”