У меня возникли проблемы с подписями/проверкой строки с Crypto ++. Я пробовал методы, перечисленные на этом веб-сайте, среди других, в течение нескольких месяцев, без успеха. Я ранее пробовал решение стиля C, размещенное здесь: http://www.cryptopp.com/wiki/Elliptic_Curve_Digital_Signature_Algorithm, но в настоящее время я работаю над реализацией с использованием фильтров.ECDSA Неправильно подписание/проверка
Моя попытка ниже является модификацией решения, размещенной здесь: Get ECDSA signature with Crypto++.
Следующий код выводит ошибку: ERROR: VerifierFilter: digital signature not valid
ECDSA<ECP, SHA256>::PrivateKey privateKey;
ECDSA<ECP, SHA256>::PublicKey publicKey;
AutoSeededRandomPool prng, rrng;
privateKey.Initialize(prng, CryptoPP::ASN1::secp256k1());
privateKey.MakePublicKey(publicKey);
string signature;
signature.erase();
string message = "Do or do not. There is no try.";
StringSource(message, true,
new SignerFilter(rrng,
ECDSA<ECP, SHA256>::Signer(privateKey),
new StringSink(signature)));
try
{
StringSource(signature + message, true,
new SignatureVerificationFilter(
ECDSA<ECP, SHA256>::Verifier(publicKey), NULL,
SignatureVerificationFilter::THROW_EXCEPTION
) // SignatureVerificationFilter
); // StringSource
}
catch (CryptoPP::Exception& e)
{
std::cerr << "\n\nERROR: " << e.what() << std::endl;
}
Любая помощь приветствуется, спасибо.
@stacker - Я вижу, где вы получили код (к сожалению, я парень, который, вероятно, написал его). Я получу эти wiki-страницы в следующий раз, когда приду на воздух. – jww
@ jww - Ни один вариант не разработан для меня. Я применил ваши изменения в первом решении для моего подписания, но не повезло. Кроме того, Ref(), по-видимому, не является членом. Спасибо за помощь. – stacker
@stacker - примените те же изменения в коде подписывателя в случае, если создается плохая подпись (что объясняет неудачную проверку). – jww