Ejemplo n.º 1
0
 public static BigInteger CreateRandomInRange(BigInteger min, BigInteger max, SecureRandom random)
 {
     int num = min.CompareTo(max);
     if (num >= 0)
     {
         if (num > 0)
         {
             throw new ArgumentException("'min' may not be greater than 'max'");
         }
         return min;
     }
     if (min.BitLength > (max.BitLength / 2))
     {
         return CreateRandomInRange(BigInteger.Zero, max.Subtract(min), random).Add(min);
     }
     for (int i = 0; i < 0x3e8; i++)
     {
         BigInteger integer = new BigInteger(max.BitLength, random);
         if ((integer.CompareTo(min) >= 0) && (integer.CompareTo(max) <= 0))
         {
             return integer;
         }
     }
     return new BigInteger(max.Subtract(min).BitLength - 1, random).Add(min);
 }
Ejemplo n.º 2
0
 internal bool RabinMillerTest(int certainty, Random random)
 {
     BigInteger integer4;
     BigInteger m = this;
     BigInteger integer2 = m.Subtract(One);
     int lowestSetBit = integer2.GetLowestSetBit();
     BigInteger exponent = integer2.ShiftRight(lowestSetBit);
     Label_001D:
     integer4 = new BigInteger(m.BitLength, random);
     if ((integer4.CompareTo(One) <= 0) || (integer4.CompareTo(integer2) >= 0))
     {
         goto Label_001D;
     }
     BigInteger integer5 = integer4.ModPow(exponent, m);
     if (!integer5.Equals(One))
     {
         int num2 = 0;
         while (!integer5.Equals(integer2))
         {
             if (++num2 == lowestSetBit)
             {
                 return false;
             }
             integer5 = integer5.ModPow(Two, m);
             if (integer5.Equals(One))
             {
                 return false;
             }
         }
     }
     certainty -= 2;
     if (certainty > 0)
     {
         goto Label_001D;
     }
     return true;
 }