X-Git-Url: http://git.euphorik.ch/?p=crypto_lab3.git;a=blobdiff_plain;f=src%2FRsaStd.cpp;fp=src%2FRsaStd.cpp;h=17c234522dc071de3b1d543904c94e0c64a57f78;hp=0000000000000000000000000000000000000000;hb=91989c2627abc2cdf511f17169e4f862dc55e838;hpb=7975d02c6c1ee679a236087e86955c086f1a9a8e diff --git a/src/RsaStd.cpp b/src/RsaStd.cpp new file mode 100644 index 0000000..17c2345 --- /dev/null +++ b/src/RsaStd.cpp @@ -0,0 +1,40 @@ +#include "RsaStd.h" + +using namespace std; + +#include "Rand.h" +#include "Utils.h" + +pair RsaStd::generateRSAKeys(uint exponent, uint keySizeBits) +{ + mpz_class p, q, phi; + Rsa::KeyPub kPub; + KeyPriv kPriv; + + do + { + kPub.e = exponent; + p = Rand::randPrime(keySizeBits / 2); + q = Rand::randPrime(keySizeBits / 2); + + kPriv.n = kPub.n = p * q; + phi = (p - 1) * (q - 1); + + } 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. + +// For debugging purpose. +// Utils::print("p", p); +// Utils::print("q", q); +// Utils::print("n", kPub.n); +// Utils::print("phi", phi); +// Utils::print("d", kPriv.d); + + return make_pair(kPub, kPriv); +} + +mpz_class RsaStd::sign(const mpz_class& m, const KeyPriv& kPriv) +{ + mpz_class result; + mpz_powm_sec(result.get_mpz_t(), m.get_mpz_t(), kPriv.d.get_mpz_t(), kPriv.n.get_mpz_t()); + return result; +}