私は 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 メソッドには 2 つのオーバーロードがありますが、いずれもポイント圧縮の状況には対応していません。
私の質問は、「PublicKey.Initialize(curve,G,n,Q)」の Crypto++ に固有のものです。現在のプロジェクトでは publicKey 全体を転送できないため、ドメイン パラメータをインデックス値として指定する必要があり、Qx 値のみを転送できます。したがって、「PublicKey.Initialize(curve,G,n,Q)」のようなものを使用して publicKey を初期化する必要がありますが、ポイント圧縮に関するそのような初期化 API が見つかりません。
というわけで、これは「ポイント圧縮のやり方」ではなく、「Qy 値を持たずに公開鍵を初期化する方法はありますか?」ということです。