I am trying to follow the instructions in https://www.secg.org/sec1-v2.pdf section 4.1.6 Output: An elliptic curve public key Q for which (r, s) is a valid signature on message M. Actions: Find public key Q as follows. 1. For j from 0 to h do the following. 1.1. Let x = r + jn. 1.2. Convert the integer x to an octet string X of length mlen using the conversion routine specified in Section 2.3.7, where mlen = d(log2 p)/8e or mlen = dm/8e. 1.3. Convert the octet string 0216kX to an elliptic curve point R using the conversion routine specified in Section 2.3.4. If this conversion routine outputs “invalid”, then do another iteration of Step 1. 1.4. If nR 6= O, then do another iteration of Step 1. 1.5. Compute e from M using Steps 2 and 3 of ECDSA signature verification. 1.6. For k from 1 to 2 do the following. 1.6.1. Compute a candidate public key as: Q = r −1 (sR − eG).
The code so far: DL_GroupParameters_EC<ECP> params = ASN1::secp256k1(); Integer r("eefd86d83fd068cf979cfb11bf0696c66fc568ee342319a733ac9e804d6ea88d"); Integer s("0c12365ddc49f1b631c4c4a80764f8938afdd05563e00cff367da7cb715fccf1"); std::string message = "e9128504a817c80082520894787945765ac5a4f186a13e702664d6ecb78f57b68203e880830138818080"; byte hash[CryptoPP::SHA256::DIGESTSIZE]; SHA256().CalculateDigest(hash, (const byte*)message.data(), message.size()); Integer e(hash, CryptoPP::SHA256::DIGESTSIZE); for (int j = 0; j <= params.GetCofactor(); ++j) { Integer x = r + j * params.GetSubgroupOrder(); SecByteBlock xBytes(x.MinEncodedSize()); x.Encode(xBytes.BytePtr(), xBytes.SizeInBytes()); ECP::Point R; if (!params.GetCurve().DecodePoint(R, xBytes, xBytes.SizeInBytes())) { std::cout << "Invalid point. Trying another iteration." << std::endl; continue; } if (!params.GetCurve().Multiply(e, R).identity) { std::cout << "nR is not the point at infinity. Trying another iteration." << std::endl; continue; } for (int k = 1; k <= 2; ++k) { // Compute a candidate public key ... } } Any Idea how to compute a candidate public key considering according to manual it is Q = r −1 (sR − eG)? Em quinta-feira, 9 de novembro de 2023 às 08:54:44 UTC-3, Ricardo Alex escreveu: > According to https://www.secg.org/sec1-v2.pdf > > In section 4.1.6 Public Key Recovery Operation it' s possible to > recover the public Key Q, at least to within a small number of choices, > given an ECDSA signature (r, s) and EC domain parameters. > > Input: The public key recovery operations takes as input: > > 1. Elliptic curve domain parameters T = (p, a, b, G, n, h) or T = (m, > f(x), a, b, G, n, h) at the desired security level. > 2. A message M. > 3. An ECDSA signature value (r, s) that is valid on message M for some > public key to be determined. > > Is it possible to achieve that using the crypto++ library? > -- You received this message because you are subscribed to the Google Groups "Crypto++ Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to cryptopp-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/cryptopp-users/6dc529f2-9adc-4894-9134-b52b705bfef6n%40googlegroups.com.