这里记录使用Crypto++ ecdsa 进行签名和认证的代码片段,可直接运行。
运行环境:Windows, Visual Studio 2017
需安装Crypto++库,可使用cvpkg工具直接集成该库到visual Studio 中:
vcpkg install cryptopp:x64-windows
代码:
#include <iostream>
#include <cryptopp/eccrypto.h>
#include <cryptopp/osrng.h>
#include <cryptopp/oids.h>
#include <cryptopp/hex.h>
using namespace std;
using namespace CryptoPP;
int main(int argc, const char* argv[]){
using namespace CryptoPP;
AutoSeededRandomPool prng;
ECDSA<ECP, SHA256>::PrivateKey k1;
//k1.Initialize(prng, ASN1::secp256r1());
//ECDSA<ECP, SHA256>::Signer signer(k1);
string exp = "E4A6CFB431471CFCAE491FD566D19C87082CF9FA7722D7FA24B2B3F5669DBEFB";
HexDecoder decoder;
decoder.Put((byte*)&exp[0], exp.size());
decoder.MessageEnd();
Integer x;
x.Decode(decoder, decoder.MaxRetrievable());
k1.Initialize(ASN1::secp256r1(), x);
ECDSA<ECP, SHA256>::Signer signer(k1);
std::string message = "Do or do not. There is no try.";
size_t siglen = signer.MaxSignatureLength();
std::string signature(siglen, 0x00);
siglen = signer.SignMessage(prng, (const byte*)&message[0], message.size(), (byte*)&signature[0]);
signature.resize(siglen);
ECDSA<ECP, SHA256>::PublicKey publicKey;
k1.MakePublicKey(publicKey);
ECDSA<ECP, SHA256>::Verifier verifier(publicKey);
bool result = verifier.VerifyMessage((const byte*)&message[0], message.size(), (const byte*)&signature[0], signature.size());
// Verification failure?
if (!result) {
std::cout << "Failed to verify signature on message" << std::endl;
}
else {
std::cout << "All good!" << std::endl;
}
system("pause");
return 0;
}
还可参考:https://www.cryptopp.com/wiki/Elliptic_curve_digital_signature_algorithm#Key_Initialization