Как правильно использовать ECDSA в Crypto ++? - PullRequest
1 голос
/ 21 октября 2019

Когда я проверяю подпись с помощью верификатора ECDSA в Crypto ++, если открытый ключ неверен, метод просто завершает работу приложения. Должен ли я попытаться поймать исключение? Каков наилучший способ справиться с этим?

Спасибо!

1 Ответ

0 голосов
/ 21 октября 2019

... я должен попытаться поймать исключение? Как лучше всего справиться с этим?

Это зависит от того, как вы хотите это сделать. Я думаю, что есть три варианта.

Информация ниже взята из Алгоритм цифровой подписи эллиптической кривой и SignatureVerificationFilter на вики Crypto ++.

Во-первых,вы можете перехватить исключение SignatureVerificationFailed, если хотите:

try
{
    DSA::Verifier verifier(publicKey);
    StringSource ss2(message+signature, true,
        new SignatureVerificationFilter(
            verifier, NULL, THROW_EXCEPTION
            /* SIGNATURE_AT_END */
       )
    );

    std::cout << "Verified signature on message" << std::endl;
}
catch (SignatureVerificationFailed& ex)
{
    std::cerr << "Failed to verify signature on message" << std::endl;
}

Во-вторых, вы можете получить результат в виде логического значения. Обратите внимание на отсутствие THROW_EXCEPTION:

bool result = false;
StringSource ss(message+signature, true,
    new SignatureVerificationFilter(
        verifier,
        new ArraySink(
            (byte*)&result, sizeof(result)),
        PUT_RESULT | SIGNATURE_AT_END
   )
);

if(result)
    std::cout << "Verified signature on message" << std::endl;
else
    std::cerr << "Failed to verify signature on message" << std::endl;

В-третьих, вы можете отказаться от конвейеров и просто вызвать VerifyMessage для объекта Verifier:

bool result = verifier.VerifyMessage(ConstBytePtr(message), BytePtrSize(message), ConstBytePtr(signature), BytePtrSize(signature));
if(result)
    std::cout << "Verified signature on message" << std::endl;
else
    std::cerr << "Failed to verify signature on message" << std::endl;
...