I wanted to put that on the wiki, but registration doesn't quite work
for me there...
Here is code to generate private/public key pair and then sign and
verify a message.
using namespace CryptoPP;
AutoSeededRandomPool rng;
// Generating private key
ECIES<ECP>::PrivateKey privateKey;
privateKey.Initialize(rng, ASN1::secp160r1());
// Generating matching public key
ECIES<ECP>::PublicKey publicKey;
privateKey.MakePublicKey(publicKey);
// Signing a message
ECDSA<ECP>::Signer signer(privateKey);
std::string message="message";
std::string signature;
StringSource(message, true, new SignerFilter(rng, signer, new
StringSink(signature)));
// signature contains bytes, not ascii string. Just use base32 or hex
encoder if needed.
// Verifying message
ECDSA<ECP>::Verifier verifier(publicKey);
bool isValid = verifier.VerifyMessage((const byte*)message.data(),
message.size(), (const byte*)signature.data(), signature.size());
Of course for this to be usefull you'll need to load and save keys:
Saving:
ECIES<ECP>::PrivateKey privateKey;
// generate key ...
std::string tmp;
StringSink sink(tmp);
privateKey.Save(sink);
std::string base32encodedKey;
StringSource(tmp, true, new Base32Encoder(new StringSink
(base32encodedKey)));
Loading:
ECIES<ECP>::PrivateKey privateKey;
ByteQueue bq;
StringSource(base32encodedKey, true, new Base32Decoder(new Redirector
(bq)));
privateKey.Load(bq);
Same with public keys.