#include <gmpxx.h>
+#include "Utils.h"
+#include "Rand.h"
#include "Rsa.h"
+#include "RsaStd.h"
#include "RsaCrt.h"
const uint KEY_SIZE_BITS = 1024;
const uint RSA_PUBLIC_EXPONENT = 65537;
+bool testRsaStandard()
+{
+ const auto& keys = RsaStd::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
+ const auto& kPub = keys.first;
+ const auto& kPriv = keys.second;
+
+ mpz_class message = Rand::randSize(KEY_SIZE_BITS / 2);
+ mpz_class signature = RsaStd::sign(message, kPriv);
+
+ return Rsa::verifySignature(message, signature, kPub) && !Rsa::verifySignature(message + 1, signature, kPub);
+}
+
+bool testRsaCrt()
+{
+ const auto& keys = RsaCrt::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
+ const auto& kPub = keys.first;
+ const auto& kPriv = keys.second;
+
+ mpz_class message = Rand::randSize(KEY_SIZE_BITS / 2);
+ mpz_class signature = RsaCrt::sign(message, kPriv);
+
+ return Rsa::verifySignature(message, signature, kPub) && !Rsa::verifySignature(message + 1, signature, kPub);
+}
+
+int timeSignRsaStd(int N)
+{
+ Timer timer;
+ const auto& keys = RsaStd::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
+
+ for (int i = 0; i < N; i++)
+ {
+ mpz_class message = Rand::randSize(KEY_SIZE_BITS / 2);
+ RsaStd::sign(message, keys.second);
+ }
+
+ return timer.ms();
+}
+
+int timeSignRsaCRT(int N)
+{
+ Timer timer;
+ const auto& keys = RsaCrt::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
+
+ for (int i = 0; i < N; i++)
+ {
+ mpz_class message = Rand::randSize(KEY_SIZE_BITS / 2);
+ RsaCrt::sign(message, keys.second);
+ }
+
+ return timer.ms();
+}
+
+void measuresRsaDurations()
+{
+ const int N = 10000;
+ int timeRsaStd = timeSignRsaStd(N);
+ int timeRsaCRT = timeSignRsaCRT(N);
+
+ cout << N << " x RSA standard: " << timeRsaStd << " ms" << endl;
+ cout << N << " x RSA CRT: " << timeRsaCRT << " ms" << endl;
+ cout << "Speedup: " << (double(timeRsaStd) / double(timeRsaCRT)) << endl;
+}
+
int main(int argc, char** argv)
{
vector<string> args;
for (int i = 0; i < argc; i++)
args.push_back(string(argv[i]));
- const auto& keys = Rsa::generateRSAKeys(RSA_PUBLIC_EXPONENT, KEY_SIZE_BITS);
- const auto& kPub = keys.first;
- const auto& kPriv = keys.second;
-
- mpz_class message(42);
- mpz_class signature = Rsa::sign(message, kPriv);
+ if (!testRsaStandard())
+ cout << "RSA standard failed!" << endl;
- mpz_class message2(42);
- cout << "verify: " << Rsa::verifySignature(message2, signature, kPub) << endl;
+ if (!testRsaCrt())
+ cout << "RSA CRT failed!" << endl;
- mpz_class message3(43);
- cout << "verify: " << Rsa::verifySignature(message3, signature, kPub) << endl;
+ measuresRsaDurations();
return 0;
}