be219980b16a86d96e12e99d5f1a6661ca8a100f
[crypto_lab3.git] / src / Rsa.cpp
1 #include "Rsa.h"
2
3 using namespace std;
4
5 #include "Rand.h"
6 #include "Utils.h"
7
8 pair<Rsa::KeyPub, Rsa::KeyPriv> Rsa::generateRSAKeys(uint exponent, uint keySizeBits)
9 {
10 mpz_class p, q, phi;
11 KeyPub kPub;
12 KeyPriv kPriv;
13
14 do
15 {
16 kPub.e = exponent;
17 p = Rand::randPrime(keySizeBits / 2);
18 q = Rand::randPrime(keySizeBits / 2);
19
20 kPriv.n = kPub.n = p * q;
21 phi = (p - 1) * (q - 1);
22
23 } while (mpz_invert(kPriv.d.get_mpz_t(), kPub.e.get_mpz_t(), phi.get_mpz_t()) == 0);
24
25 // For debugging purpose.
26 // print("p", p);
27 // print("q", q);
28 // print("n", kPub.n);
29 // print("phi", phi);
30 // print("d", kPriv.d);
31
32 return make_pair(kPub, kPriv);
33 }
34
35 mpz_class Rsa::sign(const mpz_class& m, const KeyPriv& kPriv)
36 {
37 mpz_class result;
38 mpz_powm_sec(result.get_mpz_t(), m.get_mpz_t(), kPriv.d.get_mpz_t(), kPriv.n.get_mpz_t());
39 return result;
40 }
41
42 bool Rsa::verifySignature(const mpz_class& m, const mpz_class& sig, const KeyPub& kPub)
43 {
44 mpz_class mPrime;
45 mpz_powm_sec(mPrime.get_mpz_t(), sig.get_mpz_t(), kPub.e.get_mpz_t(), kPub.n.get_mpz_t());
46 return m == mPrime;
47 }