我目前在使用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;
 }

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

最佳答案

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

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



因为使用了THROW_EXCEPTION,所以必须交换signaturemessage,或者必须添加SIGNATURE_AT_BEGIN。在这种情况下,以下代码不会引发异常。

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

关于c++ - ECDSA未正确签名/验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28114798/

10-10 11:20