8 pair
<Rsa::KeyPub
, RsaCrt::KeyPriv
> RsaCrt::generateRSAKeys(uint exponent
, uint keySizeBits
)
17 kPriv
.p
= Rand::randPrime(keySizeBits
/ 2);
18 kPriv
.q
= Rand::randPrime(keySizeBits
/ 2);
20 kPub
.n
= kPriv
.p
* kPriv
.q
;
21 phi
= (kPriv
.p
- 1) * (kPriv
.q
- 1);
23 // d = e^-1 (mode phi).
24 } while (mpz_invert(d
.get_mpz_t(), kPub
.e
.get_mpz_t(), phi
.get_mpz_t()) == 0);
26 kPriv
.dp
= d
% (kPriv
.p
- 1);
27 kPriv
.dq
= d
% (kPriv
.q
- 1);
29 // qInv = q^-1 (mod p)
30 mpz_invert(kPriv
.qInv
.get_mpz_t(), kPriv
.q
.get_mpz_t(), kPriv
.p
.get_mpz_t());
32 return make_pair(kPub
, kPriv
);
35 mpz_class
RsaCrt::sign(const mpz_class
& m
, const KeyPriv
& kPriv
)
39 mpz_powm_sec(sp
.get_mpz_t(), m
.get_mpz_t(), kPriv
.dp
.get_mpz_t(), kPriv
.p
.get_mpz_t());
40 mpz_powm_sec(sq
.get_mpz_t(), m
.get_mpz_t(), kPriv
.dq
.get_mpz_t(), kPriv
.q
.get_mpz_t());
42 return sq
+ ((kPriv
.qInv
* (sp
- sq
)) % kPriv
.p
) * kPriv
.q
;
45 mpz_class
RsaCrt::signWithFaultySp(const mpz_class
& m
, const KeyPriv
& kPriv
)
49 mpz_powm_sec(sp
.get_mpz_t(), m
.get_mpz_t(), kPriv
.dp
.get_mpz_t(), kPriv
.p
.get_mpz_t());
50 mpz_powm_sec(sq
.get_mpz_t(), m
.get_mpz_t(), kPriv
.dq
.get_mpz_t(), kPriv
.q
.get_mpz_t());
52 mpz_combit(sp
.get_mpz_t(), 42); // Flip the fourty second bit.
54 return sq
+ ((kPriv
.qInv
* (sp
- sq
)) % kPriv
.p
) * kPriv
.q
;