Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <rsa.h>
- #include <osrng.h>
- #include <pssr.h>
- #include <iostream>
- using namespace CryptoPP;
- using namespace std;
- class MyPrivKey : public RSA::PrivateKey {
- public:
- template<typename... Args>
- MyPrivKey(Args&&... args) : RSA::PrivateKey(std::forward<Args>(args)...) {}
- Integer CalculateInverse(RandomNumberGenerator &rng, const Integer &x) const override {
- // Never called :'(
- return RSA::PrivateKey::CalculateInverse(rng, x);
- }
- };
- int main() {
- ///////////////////////////////////////
- // Pseudo Random Number Generator
- AutoSeededRandomPool rng;
- ///////////////////////////////////////
- // Generate Parameters
- InvertibleRSAFunction params;
- params.GenerateRandomWithKeySize(rng, 1536);
- ///////////////////////////////////////
- // Generated Parameters
- Integer n = params.GetModulus();
- Integer p = params.GetPrime1();
- Integer q = params.GetPrime2();
- Integer d = params.GetPrivateExponent();
- Integer e = params.GetPublicExponent();
- ///////////////////////////////////////
- // Dump
- cout << "RSA Parameters:" << endl;
- cout << " n: " << n << endl;
- cout << " p: " << p << endl;
- cout << " q: " << q << endl;
- cout << " d: " << d << endl;
- cout << " e: " << e << endl;
- cout << endl;
- ///////////////////////////////////////
- // Create Keys
- auto privateKey = new MyPrivKey(params);
- RSA::PublicKey publicKey(params);
- // Message
- string message = "Yoda said, Do or Do Not. There is no try.";
- // Signer object
- RSASS<PSS, SHA1>::Signer signer(*privateKey);
- delete privateKey;
- // Create signature space
- size_t length = signer.MaxSignatureLength();
- SecByteBlock signature(length);
- // Sign message
- length = signer.SignMessage(rng, (const byte*) message.c_str(),
- message.length(), signature);
- // Resize now we know the true size of the signature
- signature.resize(length);
- // Verifier object
- RSASS<PSS, SHA1>::Verifier verifier(publicKey);
- // Verify
- bool result = verifier.VerifyMessage((const byte*)message.c_str(),
- message.length(), signature, signature.size());
- // Result
- if(true == result) {
- cout << "Signature on message verified" << endl;
- } else {
- cout << "Message verification failed" << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment