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