First part: RSA CRT versus RSA std.
[crypto_lab3.git] / src / RsaStd.cpp
diff --git a/src/RsaStd.cpp b/src/RsaStd.cpp
new file mode 100644 (file)
index 0000000..17c2345
--- /dev/null
@@ -0,0 +1,40 @@
+#include "RsaStd.h"
+
+using namespace std;
+
+#include "Rand.h"
+#include "Utils.h"
+
+pair<Rsa::KeyPub, RsaStd::KeyPriv> RsaStd::generateRSAKeys(uint exponent, uint keySizeBits)
+{
+   mpz_class p, q, phi;
+   Rsa::KeyPub kPub;
+   KeyPriv kPriv;
+
+   do
+   {
+      kPub.e = exponent;
+      p = Rand::randPrime(keySizeBits / 2);
+      q = Rand::randPrime(keySizeBits / 2);
+
+      kPriv.n = kPub.n = p * q;
+      phi = (p - 1) * (q - 1);
+
+   } while (mpz_invert(kPriv.d.get_mpz_t(), kPub.e.get_mpz_t(), phi.get_mpz_t()) == 0); // If 'd' is not invertible we try another primes.
+
+// For debugging purpose.
+//   Utils::print("p", p);
+//   Utils::print("q", q);
+//   Utils::print("n", kPub.n);
+//   Utils::print("phi", phi);
+//   Utils::print("d", kPriv.d);
+
+   return make_pair(kPub, kPriv);
+}
+
+mpz_class RsaStd::sign(const mpz_class& m, const KeyPriv& kPriv)
+{
+   mpz_class result;
+   mpz_powm_sec(result.get_mpz_t(), m.get_mpz_t(), kPriv.d.get_mpz_t(), kPriv.n.get_mpz_t());
+   return result;
+}