/// <summary>Choose a random prime value for use with RSA</summary> /// <param name="bitlength">the bit-length of the returned prime</param> /// <param name="e">the RSA public exponent</param> /// <returns>a prime p, with (p-1) relatively prime to e</returns> protected virtual BigInteger ChooseRandomPrime(int bitlength, BigInteger e) { for (;;) { BigInteger p = new BigInteger(bitlength, 1, param.Random); if (p.Mod(e).Equals(BigInteger.One)) continue; if (!p.IsProbablePrime(param.Certainty)) continue; if (!e.Gcd(p.Subtract(BigInteger.One)).Equals(BigInteger.One)) continue; return p; } }
/** * Generate a suitable blind factor for the public key the generator was initialised with. * * @return a random blind factor */ public BigInteger GenerateBlindingFactor() { if (key == null) throw new InvalidOperationException("generator not initialised"); BigInteger m = key.Modulus; int length = m.BitLength - 1; // must be less than m.BitLength BigInteger factor; BigInteger gcd; do { factor = new BigInteger(length, random); gcd = factor.Gcd(m); } while (factor.SignValue == 0 || factor.Equals(BigInteger.One) || !gcd.Equals(BigInteger.One)); return factor; }
/// <summary>Choose a random prime value for use with RSA</summary> /// <param name="bitlength">the bit-length of the returned prime</param> /// <param name="e">the RSA public exponent</param> /// <returns>a prime p, with (p-1) relatively prime to e</returns> protected virtual BigInteger ChooseRandomPrime(int bitlength, BigInteger e) { bool eIsKnownOddPrime = (e.BitLength <= SPECIAL_E_BITS) && Arrays.Contains(SPECIAL_E_VALUES, e.IntValue); for (;;) { BigInteger p = new BigInteger(bitlength, 1, parameters.Random); if (p.Mod(e).Equals(One)) continue; if (!p.IsProbablePrime(parameters.Certainty, true)) continue; if (!eIsKnownOddPrime && !e.Gcd(p.Subtract(One)).Equals(One)) continue; return p; } }
public BigInteger DrawR() { if (n != null) { BigInteger gcd = null; BigInteger one = new BigInteger("1"); BigInteger r = null; SecureRandom random = new SecureRandom(); byte[] randomBytes = new byte[10]; // --- verify that gcd(r,n) = 1 && r < n && r > 1 do { random.NextBytes(randomBytes); r = new BigInteger(1, randomBytes); gcd = r.Gcd(n); } while (!gcd.Equals(one) || r.CompareTo(n) >= 0 || r.CompareTo(one) <= 0); return r; } else { Console.WriteLine("[fail] Get public key from Bank first!"); return null; } }