RSA Signature Schemes
From Crypto++ Wiki
For the main RSA page, visit RSA Cryptography. For encryption schemes, visit RSA Encryption Schemes. For a detailed treatment of key generation, loading, saving, validation, and formats, see Keys and Formats.
[edit] Sample Programs
[edit] Generate Keys
/////////////////////////////////////// // 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 RSA::PrivateKey privateKey(params); RSA::PublicKey publicKey(params);
[edit] RSA Signature Scheme with Appendix
AutoSeededRandomPool rng;
InvertibleRSAFunction parameters;
parameters.GenerateRandomWithKeySize(rng, 1536);
RSA::PrivateKey privateKey(parameters);
RSA::PublicKey publicKey(parameters);
// Message
string message = "Yoda said, Do or Do Not. There is no try.";
// Signer object
RSASS<PSS, SHA1>::Signer signer(privateKey);
// Create signature space
size_t length = signer.MaxSignatureLength();
SecByteBlock signature(length);
// Sign message
signer.SignMessage(rng, (const byte*) message.c_str(),
message.length(), signature);
// 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;
}
[edit] RSA Signature Scheme with Appendix (Filters)
// Generate ot Load keys
RSA::PrivateKey privateKey = ...;
RSA::PublicKey publicKey = ...;
// Message
string message = "Yoda said, Do or Do Not. There is no try.";
string signature, recovered;
////////////////////////////////////////////////
// Sign and Encode
RSASS<PSS, SHA1>::Signer signer(privateKey);
StringSource(message, true,
new SignerFilter(rng, signer,
new StringSink(signature)
) // SignerFilter
); // StringSource
////////////////////////////////////////////////
// Verify and Recover
RSASS<PSS, SHA1>::Verifier verifier(publicKey);
StringSource(message+signature, true,
new SignatureVerificationFilter(
verifier,
new StringSink(recovered),
SignatureVerificationFilter::THROW_EXCEPTION |
SignatureVerificationFilter::PUT_MESSAGE
) // SignatureVerificationFilter
); // StringSource
////////////////////////////////////////////////
// No exception - use recovered message
...
[edit] RSA Probabilistic Signature Scheme with Recovery
////////////////////////////////////////////////
// Generate keys
AutoSeededRandomPool rng;
InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rng, 1536);
RSA::PrivateKey privateKey(params);
RSA::PublicKey publicKey(params);
// Signing
RSASS<PSSR, SHA1>::Signer signer(privateKey);
RSASS<PSSR, SHA1>::Verifier verifier(publicKey);
// Setup
byte message[] = "RSA-PSSR Test";
size_t messageLen = sizeof(message);
////////////////////////////////////////////////
// Sign and Encode
SecByteBlock signature(signer.MaxSignatureLength(messageLen));
size_t signatureLen = signer.SignMessageWithRecovery(rng, message,
messageLen, NULL, 0, signature);
////////////////////////////////////////////////
// Verify and Recover
SecByteBlock recovered(
verifier.MaxRecoverableLengthFromSignatureLength(signatureLen)
);
DecodingResult result = verifier.RecoverMessage(recovered, NULL,
0, signature, signatureLen);
if (!result.isValidCoding) {
throw Exception(Exception::OTHER_ERROR, "Invalid Signature");
}
////////////////////////////////////////////////
// Use recovered message
...
[edit] RSA Probabilistic Signature Scheme with Recovery (Filter)
////////////////////////////////////////////////
// Generate or Load keys
RSA::PrivateKey privateKey = ...;
RSA::PublicKey publicKey = ...;
////////////////////////////////////////////////
// Setup
string message = "RSA-PSSR Test", signature, recovered;
////////////////////////////////////////////////
// Sign and Encode
RSASS<PSSR, SHA1>::Signer signer(privateKey);
StringSource(message, true,
new SignerFilter(rng, signer,
new StringSink(signature),
true // putMessage for recovery
) // SignerFilter
); // StringSource
////////////////////////////////////////////////
// Verify and Recover
RSASS<PSSR, SHA1>::Verifier verifier(publicKey);
StringSource(signature, true,
new SignatureVerificationFilter(
verifier,
new StringSink(recovered),
THROW_EXCEPTION | PUT_MESSAGE
) // SignatureVerificationFilter
); // StringSource
cout << "Verified signature on message" << endl;
[edit] RSA Signature Scheme (PKCS v1.5)
Though similar to RSA-SSA, RSASSA_PKCS1v15_SHA_Signer and RSASSA_PKCS1v15_SHA_Verifier uses PKCS v1.5 padding. The MD2 and MD5 variants of RSASSA_PKCS1v15_<Digest>_Signer and RSASSA_PKCS1v15_<Digest>_Verifier should not be used.
AutoSeededRandomPool rng;
InvertibleRSAFunction parameters;
parameters.GenerateRandomWithKeySize(rng, 1536);
RSA::PrivateKey privateKey(parameters);
RSA::PublicKey publicKey(parameters);
// Message
string message = "Yoda said, Do or Do Not. There is no try.";
// Signer object
RSASSA_PKCS1v15_SHA_Signer signer(privateKey);
// Create signature space
size_t length = signer.MaxSignatureLength();
SecByteBlock signature(length);
// Sign message
signer.SignMessage(rng, (const byte*) message.c_str(),
message.length(), signature);
// Verifier object
RSASSA_PKCS1v15_SHA_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;
}
[edit] RSA Signature Generation Given d and n
Given Integers d and n rather than a RSA::PrivateKey, perform the following to create a signer object [1]. Attempting to use a RSA::PrivateKey by calling Initialize (i.e., not factoring n) will result in an exception [2].
// Use InvertibleRSAFunction to factor 'n' InvertibleRSAFunction params; params.Initialize(n, e, d); RSA::PrivateKey(params); ...
If the public exponent has been misplaced, common values for the exponent are 3 (Microsoft CAPI/C#), 17 (Crypto++), and 65535 (Java).
[edit] RSA Signature Verification Given e and n
Given Integers e and n rather than a RSA::PublicKey, perform the following to create a verifier object.
RSASS<PSS, SHA>::Verifier verifier(n, e);
RSASS<PSS, SHA>::Verifier verifier; verifier.AccessKey().Initialize(n, e);
[edit] Downloads
RSA-SSA-Test.zip - Demonstrates RSA-SSA (Appendix) - 5KB
RSA-SSA-Filter-Test.zip - Demonstrates RSA-SSA (Appendix) using Filters - 5KB
RSA-PSSR-Test.zip - Demonstrates RSA-PSSR (Recovery) - 7KB
RSA-PSSR-Filter-Test.zip Demonstrates RSA-PSSR (Recovery) using Filters - 5KB
RSA-SSA-PKCSv15-Test.zip - Demonstrates RSA-SSA (PKCS v1.5) - 5KB