public static RSACrypto CreateInstance(int bitLength, BigInteger exponent) // DOES NOT WORK { RandomNumberGenerator random = Randomizer.GetRandom(); int qs = bitLength >> 1; BigInteger d = 0; BigInteger dp = 0; BigInteger dq = 0; BigInteger inverseQ = 0; BigInteger modules = 0; BigInteger p = 0; BigInteger q = 0; while (true) // bad, but it works. { do { p = BigIntegerPrime.GeneratePseudoPrime(bitLength - qs, 10, random); }while (BigInteger.GreatestCommonDivisor(p - 1, exponent).CompareTo(1) != 0); do { q = BigIntegerPrime.GeneratePseudoPrime(qs, 10, random); }while (BigInteger.GreatestCommonDivisor(q - 1, exponent).CompareTo(1) != 0); if (p.CompareTo(q) <= 0) { BigInteger temp = p; p = q; q = temp; } BigInteger p1 = p - 1; BigInteger q1 = q - 1; BigInteger phi = p1 * q1; if (BigInteger.GreatestCommonDivisor(phi, exponent).CompareTo(1) == 0) { modules = p * q; d = exponent.ModInverse(phi); //d = BigInteger.ModPow(ee, phi - 2, phi); // ERRORRRRRR dp = d % p1; dq = d % q1; inverseQ = q.ModInverse(p); //inverseQ = BigInteger.ModPow(q, p - 2, p); break; } } RSACParameters parameters = new RSACParameters(d, dp, dq, exponent, inverseQ, modules, p, q); return(new RSACrypto(parameters)); }
public static DiffieHellman CreateInstance(int bitLength) { RandomNumberGenerator random = Randomizer.GetRandom(); BigInteger p = BigIntegerPrime.GeneratePseudoPrime(bitLength, 10, random); BigInteger g = BigIntegerPrime.GeneratePseudoPrime(bitLength, 10, random); if (g > p) { BigInteger temp = p; p = g; g = temp; } return(new DiffieHellman(bitLength, p, g)); }