BigUnsigned CryptoScheme::genCoprime(const BigUnsigned& n) { BigUnsigned gen = random(n.bitLength()); while(gcd(gen, n) != 1) { gen = random(n.bitLength()); } return gen; }
bool CryptoScheme::isProbablyPrime(const BigUnsigned& n) { if (n%2 == 0 || n==1) return n==2; for (int i = 0; i < 30; i++) { BigUnsigned a = random(n.bitLength()-1); if (modexp(a, n-1, n) != 1) return false; } return true; }
BigUnsigned modexp(const BigInteger &base, const BigUnsigned &exponent, const BigUnsigned &modulus) { BigUnsigned ans = 1, base2 = (base % modulus).getMagnitude(); BigUnsigned::Index i = exponent.bitLength(); // For each bit of the exponent, most to least significant... while (i > 0) { i--; // Square. ans *= ans; ans %= modulus; // And multiply if the bit is a 1. if (exponent.getBit(i)) { ans *= base2; ans %= modulus; } } return ans; }