4

我目前在使用 Crypto++ 签名/验证字符串时遇到问题。几个月来,我已经尝试了这个网站上列出的方法,但没有成功。我之前尝试过发布在这里的 C 风格解决方案:http ://www.cryptopp.com/wiki/Elliptic_Curve_Digital_Signature_Algorithm ,但目前正在使用过滤器进行实现。

我在下面的尝试是对此处发布的解决方案的修改: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;
 }

任何帮助表示赞赏,谢谢。

4

2 回答 2

3

在浏览 Wiki 更长的时间后,我想我可能偶然发现了解决方案。

http://www.cryptopp.com/wiki/SignatureVerificationFilter#Signature_Generation_and_Verification

在上面的示例中,过滤器接收消息+签名的串联。当构造函数中未指定 SIGNATURE_AT_BEGIN 时,暗示 SIGNATURE_AT_END 并且必须在消息之后提供要验证的签名。如果首先插入签名,则必须将 SIGNATURE_AT_BEGIN 指定为附加标志值,如下所示。

因为THROW_EXCEPTION被使用,signature并且message必须被交换,或者SIGNATURE_AT_BEGIN必须被添加。在这种情况下,以下代码不会引发异常。

StringSource ss(signature + message, true,
    new SignatureVerificationFilter(
    verifier, NULL,
    THROW_EXCEPTION | SIGNATURE_AT_BEGIN
        ) // SignatureVerificationFilter   
        ); // StringSource  
于 2015-01-24T17:24:34.633 回答
0
StringSource(signature + message, true,
    new SignatureVerificationFilter(
        ECDSA<ECP, SHA256>::Verifier(publicKey), NULL,
        SignatureVerificationFilter::THROW_EXCEPTION
    ) // SignatureVerificationFilter   
); //

上面看起来很可疑。它看起来很可疑有两个原因。首先,它使用匿名声明,而且我知道某些版本的 GCC 会产生不好的结果。GCC 生成的代码使得析构函数运行得太快。所以命名你的声明。

其次,theSignatureVerificationFilter需要参考,而不是临时的。因此,您应该提供对 的引用verifier,或者使用Ref()成员函数(如果可用)。

首先,尝试仅:

ECDSA<ECP, SHA256>::Verifier verifier(publicKey);

StringSource ss(signature + message, true,
    new SignatureVerificationFilter(
        verifier, NULL,
        SignatureVerificationFilter::THROW_EXCEPTION
    ) // SignatureVerificationFilter   
); // StringSource 

其次,尝试:

StringSource ss(signature + message, true,
    new SignatureVerificationFilter(
        ECDSA<ECP, SHA256>::Verifier(publicKey).Ref(), NULL,
        SignatureVerificationFilter::THROW_EXCEPTION
    ) // SignatureVerificationFilter   
); // StringSource

但我不确定是否ECDSA<ECP, SHA256>::Verifier(publicKey).Ref()会工作。

于 2015-01-23T22:38:58.993 回答