Beispiel #1
0
BigUnsigned CryptoScheme::genCoprime(const BigUnsigned& n) {
    BigUnsigned gen = random(n.bitLength());
    while(gcd(gen, n) != 1) {
        gen = random(n.bitLength());
    }
    return gen;
}
Beispiel #2
0
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;
}