First part: RSA CRT versus RSA std.
[crypto_lab3.git] / src / RsaCrt.cpp
index 43f0b97..9e2c3c9 100644 (file)
@@ -1 +1,41 @@
 #include "RsaCrt.h"
+
+using namespace std;
+
+#include "Rand.h"
+#include "Utils.h"
+
+pair<Rsa::KeyPub, RsaCrt::KeyPriv> RsaCrt::generateRSAKeys(uint exponent, uint keySizeBits)
+{
+   mpz_class phi;
+   Rsa::KeyPub kPub;
+   KeyPriv kPriv;
+
+   do
+   {
+      kPub.e = kPriv.e = exponent;
+      kPriv.p = Rand::randPrime(keySizeBits / 2);
+      kPriv.q = Rand::randPrime(keySizeBits / 2);
+
+      kPriv.n = kPub.n = kPriv.p * kPriv.q;
+      phi = (kPriv.p - 1) * (kPriv.q - 1);
+
+   } while (mpz_invert(kPriv.d.get_mpz_t(), kPub.e.get_mpz_t(), phi.get_mpz_t()) == 0);
+
+   kPriv.dp = kPriv.d % (kPriv.p - 1);
+   kPriv.dq = kPriv.d % (kPriv.q - 1);
+
+   mpz_invert(kPriv.qInv.get_mpz_t(), kPriv.q.get_mpz_t(), kPriv.p.get_mpz_t());
+
+   return make_pair(kPub, kPriv);
+}
+
+mpz_class RsaCrt::sign(const mpz_class& m, const KeyPriv& kPriv)
+{
+   mpz_class sp, sq;
+
+   mpz_powm_sec(sp.get_mpz_t(), m.get_mpz_t(), kPriv.dp.get_mpz_t(), kPriv.p.get_mpz_t());
+   mpz_powm_sec(sq.get_mpz_t(), m.get_mpz_t(), kPriv.dq.get_mpz_t(), kPriv.q.get_mpz_t());
+
+   return sq + ((kPriv.qInv * (sp - sq)) % kPriv.p) * kPriv.q;
+}