我正在翻转CryptoPP,无法找到这个特定问题的答案。这里是示例源代码(部分)有点压缩的公钥初始化API吗?
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值 - 有没有一种 方式来做到这一点?初始化方法有两个重载,但没有一个是针对点数为 的压缩情况。
我的问题是关于“PublicKey.Initialize(curve,G,n,Q)”上的Crypto ++的特定问题。由于我无法将整个publicKey与我当前的项目进行传输 - 我强制将参数域 指定为索引值,并且只能传输Qx值。所以我应该使用类似“PublicKey.Initialize(curve,G,n,Q)”初始化publicKey “但是,我找不到有关点压缩的初始化API。
所以,这不是关于“如何做点压缩”,而是“有没有方法来初始化没有Qy值的 公钥?”
请准确告诉我们你有什么。你从来没有告诉你正在使用的参数//使用元素(使用点压缩)构建publicKey?'。如果它的ASN.1编码值,用'dumpasn1'显示给我们。如果原始表单是二进制的,则将其显示给我们以十六进制编码。 – jww