public BigInteger GenerateNumber(int length)
{
RNGCryptoServiceProvider createNum = new RNGCryptoServiceProvider();
byte[] number = new byte[length];
createNum.GetBytes(number);
BigInteger numToRet = new BigInteger(number);
return numToRet;
}
public bool isPrime(BigInteger N, int iterations)
{
BigInteger r = new BigInteger((N - 1).ToByteArray());
BigInteger a;
BigInteger y;
byte[] number = N.ToByteArray();
if (N == 2 || N == 3)
return true;
if (N % 2 == 0)
return false;
while (r % 2 == 0)
{
r = r / 2;
}
for (int i = 0; i < iterations; i++)
{
do
{
a = GenerateNumber(number.Length);
} while (a < 2 || a > N - 2);
y = BigInteger.ModPow(a, r, N);
BigInteger temp = r;
while (temp != N - 1 && y != 1 && y != N - 1)
{
y = BigInteger.ModPow(y, 2, N);
temp = BigInteger.Multiply(temp,2);
}
if (y != N - 1 && BigInteger.ModPow(temp,1,2) == 0)
return false;
}
return true;
}
when I run this program with small numbers it works great, when I try to run it with numbers like 150 digits long (for RSA encryption), using the GenerateNumber(int length) method, the program fails and does not continue to operate.
do you know about a way to make it work ?
thanks a lot!