在 Crypto++ 中使用 ECDSA 的正确方法是啥

Posted

技术标签:

【中文标题】在 Crypto++ 中使用 ECDSA 的正确方法是啥【英文标题】:What is the correct way to use ECDSA in Crypto++在 Crypto++ 中使用 ECDSA 的正确方法是什么 【发布时间】:2019-10-21 08:54:46 【问题描述】:

当我在 Crypto++ 中使用 ECDSA 验证器验证签名时,如果公钥不正确,该方法只会使应用程序崩溃。我应该尝试捕获异常吗?处理这个问题的最佳方法是什么?

谢谢!

【问题讨论】:

也许“崩溃”是因为你的代码有缺陷?处理任何崩溃的“最佳方法”实际上取决于崩溃以及您在做什么,我们对此一无所知。所以请创建一个minimal reproducible example 来告诉我们你正在做什么。请花点时间刷新一下how to ask good questions,以及this question checklist。 【参考方案1】:

...我应该尝试捕获异常吗?处理这个问题的最佳方法是什么?

这取决于你想怎么做。我认为有三种选择。

以下信息来自 Crypto++ wiki 上的 Elliptic Curve Digital Signature Algorithm 和 SignatureVerificationFilter。

首先,您可以根据需要捕获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;

第三,您可以放弃管道,只需在 Verifier 对象上调用 VerifyMessage

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;

【讨论】:

抱歉回复晚了,我用不正确的公钥测试,然后抛出异常。所以我们应该尝试捕捉这种情况?谢谢!

以上是关于在 Crypto++ 中使用 ECDSA 的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

ECDSA 使用 BouncyCastle 签名并使用 Crypto++ 进行验证

使用 ECDSA 签名时的 BAD_ACCESS (code=EXC_I386_GPFLT)

如何使用 golang 加密写出 ecdsa 密钥?

Crypto++ Ed448 未知 oid

node.js 中的十六进制编码 ECDSA 密钥

Go-ecc数字签名详解与代码