当前位置: 首页 > 工具软件 > TCrypto > 使用案例 >

使用Crypto++ ecdsa 进行签名和认证

贝镜
2023-12-01

这里记录使用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

 类似资料: