void RSA::GenRSAKey(RSA_PRIVATE_KEY *pri_key, RSA_PUBLIC_KEY *pub_key) { int i, phi; pri_key->d = -1; //set d to it's sentinel value while (pri_key->d < 0) { pri_key->p = 0; //clear p while ((pri_key->p)*(pri_key->q) < 255 || pri_key->p == pri_key->q) //Get p and q if n < 255 or p == q { pri_key->p = rand()%51+75; //Get seed for genPrime from 75 to 125 pri_key->p |= 1 << 0; //sets the lowest bit of seed to a 1 to ensure a odd number pri_key->p = genPrime(pri_key->p); //pass seed to genPrime to find next lowest prime pri_key->q = rand()%51+75; pri_key->q |= 1 << 0; //sets the lowest bit to a 1 to ensure a odd number pri_key->q = genPrime(pri_key->q); } pri_key->n = (pri_key->p)*(pri_key->q); //set n phi = (pri_key->p - 1)*(pri_key->q - 1); //set phi for (i = 0; i < 6; i++) //Only allow 5 guesses here before new primes are picked { pri_key->d = -1; pri_key->e = picke(pri_key->p, pri_key->q); //pick a e pri_key->d = findd(pri_key->e, phi); //find a d if (pri_key->d > 0) //break from loop if a valid d is found matching with p,q, and e break; } } pub_key->d = pri_key->d; //store public key exponent pub_key->n = pri_key->n; //store public key modulus return; }
void gen2LevelPrime(mpz_t prime, size_t length, gmp_randstate_t rand_state) { size_t sublen = findSubLength(length); mpz_t r, s; mpz_init(r); mpz_init(s); genPrime(r, sublen, rand_state); genPrime(s, sublen, rand_state); genNextLevelPrime(prime, r, s, length, rand_state); mpz_clear(r); mpz_clear(s); }