--- /dev/null
+#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;
+}