Add measures and tests.
[crypto_lab3.git] / src / RsaStd.cpp
1 #include "RsaStd.h"
2
3 #include <iostream>
4 using namespace std;
5
6 #include "Rand.h"
7 #include "Utils.h"
8
9 pair<Rsa::KeyPub, RsaStd::KeyPriv> RsaStd::generateRSAKeys(uint exponent, uint keySizeBits)
10 {
11 mpz_class p, q, phi;
12 Rsa::KeyPub kPub;
13 KeyPriv kPriv;
14
15 do
16 {
17 kPub.e = exponent;
18 p = Rand::randPrime(keySizeBits / 2);
19 q = Rand::randPrime(keySizeBits / 2);
20
21 kPriv.n = kPub.n = p * q;
22 phi = (p - 1) * (q - 1);
23
24 // d = e^-1 (mode phi).
25 } 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.
26
27 return make_pair(kPub, kPriv);
28 }
29
30 mpz_class RsaStd::sign(const mpz_class& m, const KeyPriv& kPriv)
31 {
32 mpz_class result;
33
34 // m^d (mod n).
35 mpz_powm_sec(result.get_mpz_t(), m.get_mpz_t(), kPriv.d.get_mpz_t(), kPriv.n.get_mpz_t());
36 return result;
37 }