private PrimeGeneratorResult GeneratePrimes(PrimeGeneratorParameters param) { BigInteger p, p1, p2, q, q1, q2; // 1, 2, 3, 4 covered by Guards // 5 var workingSeed = param.Seed.ToPositiveBigInteger(); // 6 var pResult = PrimeGeneratorHelper.ProvablePrimeConstruction(_sha, param.Modulus / 2, param.BitLens[0], param.BitLens[1], workingSeed, param.PublicE); if (!pResult.Success) { return(new PrimeGeneratorResult($"Bad p gen: {pResult.ErrorMessage}")); } p = pResult.Prime; p1 = pResult.Prime1; p2 = pResult.Prime2; workingSeed = pResult.PrimeSeed; do { // 7 var qResult = PrimeGeneratorHelper.ProvablePrimeConstruction(_sha, param.Modulus / 2, param.BitLens[2], param.BitLens[3], workingSeed, param.PublicE); if (!qResult.Success) { return(new PrimeGeneratorResult($"Bad q gen: {qResult.ErrorMessage}")); } q = qResult.Prime; q1 = qResult.Prime1; q2 = qResult.Prime2; workingSeed = qResult.PrimeSeed; // 8 } while (BigInteger.Abs(p - q) <= NumberTheory.Pow2(param.Modulus / 2 - 100)); var auxValues = new AuxiliaryResult(); var primePair = new PrimePair { P = p, Q = q }; return(new PrimeGeneratorResult(primePair, auxValues)); }
private PrimeGeneratorResult GeneratePrimes(PrimeGeneratorParameters param) { // 1, 2, 3, 4 covered by guards // 5 var workingSeed = param.Seed.ToPositiveBigInteger(); // 6 var ppcResult = PrimeGeneratorHelper.ProvablePrimeConstruction(_sha, param.Modulus / 2, 1, 1, workingSeed, param.PublicE); if (!ppcResult.Success) { return(new PrimeGeneratorResult($"Bad Provable Prime Construction for p: {ppcResult.ErrorMessage}")); } var p = ppcResult.Prime; workingSeed = ppcResult.PrimeSeed; BigInteger q; do { // 7 ppcResult = PrimeGeneratorHelper.ProvablePrimeConstruction(_sha, param.Modulus / 2, 1, 1, workingSeed, param.PublicE); if (!ppcResult.Success) { return(new PrimeGeneratorResult($"Bad Provable Prime Construction for q: {ppcResult.ErrorMessage}")); } q = ppcResult.Prime; workingSeed = ppcResult.PrimeSeed; // 8 } while (BigInteger.Abs(p - q) <= NumberTheory.Pow2(param.Modulus / 2 - 100)); // 9, 10 var auxValues = new AuxiliaryResult(); var primePair = new PrimePair { P = p, Q = q }; return(new PrimeGeneratorResult(primePair, auxValues)); }
private PrimeGeneratorResult GeneratePrimes(PrimeGeneratorParameters param) { BigInteger p, p1, p2, q, q1, q2, xp, xq; // 1, 2, 3, 4 covered by guards // 5 var p1Result = PrimeGen186_4.ShaweTaylorRandomPrime(param.BitLens[0], param.Seed.ToPositiveBigInteger(), _sha); if (!p1Result.Success) { return(new PrimeGeneratorResult($"Failed to generate p1: {p1Result.ErrorMessage}")); } var p2Result = PrimeGen186_4.ShaweTaylorRandomPrime(param.BitLens[1], p1Result.PrimeSeed, _sha); if (!p2Result.Success) { return(new PrimeGeneratorResult($"Failed to generate p2: {p2Result.ErrorMessage}")); } p1 = p1Result.Prime; p2 = p2Result.Prime; var pResult = PrimeGeneratorHelper.ProbablePrimeFactor(_primeTest, _entropyProvider, _pBound, param.A, p1, p2, param.Modulus, param.PublicE); if (!pResult.Success) { return(new PrimeGeneratorResult($"Failed to generate p: {pResult.ErrorMessage}")); } p = pResult.Prime; xp = pResult.XPrime; do { // 6 var q1Result = PrimeGen186_4.ShaweTaylorRandomPrime(param.BitLens[2], p2Result.PrimeSeed, _sha); if (!q1Result.Success) { return(new PrimeGeneratorResult($"Failed to generate q1: {q1Result.ErrorMessage}")); } var q2Result = PrimeGen186_4.ShaweTaylorRandomPrime(param.BitLens[3], q1Result.PrimeSeed, _sha); if (!q2Result.Success) { return(new PrimeGeneratorResult($"Failed to generate q2: {q2Result.ErrorMessage}")); } q1 = q1Result.Prime; q2 = q2Result.Prime; var qResult = PrimeGeneratorHelper.ProbablePrimeFactor(_primeTest, _entropyProvider, _pBound, param.B, q1, q2, param.Modulus, param.PublicE); if (!qResult.Success) { return(new PrimeGeneratorResult($"Failed to generate q: {qResult.ErrorMessage}")); } q = qResult.Prime; xq = qResult.XPrime; // 7 } while (BigInteger.Abs(p - q) <= NumberTheory.Pow2(param.Modulus / 2 - 100) || BigInteger.Abs(xp - xq) <= NumberTheory.Pow2(param.Modulus / 2 - 100)); var auxValues = new AuxiliaryResult { XP = xp, XQ = xq }; var primePair = new PrimePair { P = p, Q = q }; return(new PrimeGeneratorResult(primePair, auxValues)); }
private PrimeGeneratorResult GeneratePrimes(PrimeGeneratorParameters param) { BigInteger p, p1, p2, q, q1, q2, xp, xq, xp1, xp2, xq1, xq2; // 1, 2, 3 covered by guards // 4 xp1 = _entropyProvider.GetEntropy(param.BitLens[0]).ToPositiveBigInteger(); if (xp1.IsEven) { xp1++; } xp2 = _entropyProvider.GetEntropy(param.BitLens[1]).ToPositiveBigInteger(); if (xp2.IsEven) { xp2++; } p1 = xp1; while (!PrimeGeneratorHelper.MillerRabin(_primeTestMode, param.Modulus, p1, true)) { p1 += 2; } p2 = xp2; while (!PrimeGeneratorHelper.MillerRabin(_primeTestMode, param.Modulus, p2, true)) { p2 += 2; } var pResult = PrimeGeneratorHelper.ProbablePrimeFactor(_primeTestMode, _entropyProvider, _pBound, param.A, p1, p2, param.Modulus, param.PublicE); if (!pResult.Success) { return(new PrimeGeneratorResult($"Failed to generate p: {pResult.ErrorMessage}")); } p = pResult.Prime; xp = pResult.XPrime; // 5 do { xq1 = _entropyProvider.GetEntropy(param.BitLens[2]).ToPositiveBigInteger(); if (xq1.IsEven) { xq1++; } xq2 = _entropyProvider.GetEntropy(param.BitLens[3]).ToPositiveBigInteger(); if (xq2.IsEven) { xq2++; } q1 = xq1; while (!PrimeGeneratorHelper.MillerRabin(_primeTestMode, param.Modulus, q1, true)) { q1 += 2; } q2 = xq2; while (!PrimeGeneratorHelper.MillerRabin(_primeTestMode, param.Modulus, q2, true)) { q2 += 2; } var qResult = PrimeGeneratorHelper.ProbablePrimeFactor(_primeTestMode, _entropyProvider, _pBound, param.B, q1, q2, param.Modulus, param.PublicE); if (!qResult.Success) { return(new PrimeGeneratorResult($"Failed to generate q: {qResult.ErrorMessage}")); } q = qResult.Prime; xq = qResult.XPrime; // 6 } while (BigInteger.Abs(xp - xq) <= NumberTheory.Pow2(param.Modulus / 2 - 100) || BigInteger.Abs(p - q) <= NumberTheory.Pow2(param.Modulus / 2 - 100)); var auxValues = new AuxiliaryResult { XP1 = xp1, XP2 = xp2, XP = xp, XQ1 = xq1, XQ2 = xq2, XQ = xq }; var primePair = new PrimePair { P = p, Q = q }; return(new PrimeGeneratorResult(primePair, auxValues)); }
private PrimeGeneratorResult GeneratePrimes(PrimeGeneratorParameters param) { // 1, 2, 3 performed by guards // 4, 4.1 var i = 0; BigInteger p = 0; var pqLowerBound = GetBound(param.Modulus); do { do { // 4.2 if (p != 0 && _kat) { return(new PrimeGeneratorResult("Given p less than sqrt(2) * 2 ^ (n/2) - 1, need to get a new random number.")); } p = _entropyProvider.GetEntropy(param.Modulus / 2).ToPositiveBigInteger(); // 4.3 if (_performAShift) { p += (param.A - p).PosMod(8); } else if (p.IsEven) { p++; } // 4.4 } while (p < pqLowerBound); // 4.5 if (NumberTheory.GCD(p - 1, param.PublicE) == 1) { if (PrimeGeneratorHelper.MillerRabin(_primeTestMode, param.Modulus, p, false)) { break; } } // 4.6, 4.7 i++; if (i >= _iBoundForP * (param.Modulus / 2)) { return(new PrimeGeneratorResult("Too many iterations for p")); } if (_kat) { return(new PrimeGeneratorResult("Given p is not prime")); } } while (!_kat); // 5, 5.1 i = 0; BigInteger q = 0; do { do { // 5.2 if (q != 0 && _kat) { return(new PrimeGeneratorResult("Given q less than sqrt(2) * 2 ^ (n/2) - 1, need to get a new random number.")); } q = _entropyProvider.GetEntropy(param.Modulus / 2).ToPositiveBigInteger(); // 5.3 if (_performBShift) { q += (param.B - q).PosMod(8); } else if (q.IsEven) { q++; } // 5.4 // 5.5 } while (BigInteger.Abs(p - q) <= NumberTheory.Pow2(param.Modulus / 2 - 100) || q < pqLowerBound); // 5.6 if (NumberTheory.GCD(q - 1, param.PublicE) == 1) { if (PrimeGeneratorHelper.MillerRabin(_primeTestMode, param.Modulus, q, false)) { break; } } // 5.7, 5.8 i++; if (i >= _iBoundForQ * (param.Modulus / 2)) { return(new PrimeGeneratorResult("Too many iterations for q")); } if (_kat) { return(new PrimeGeneratorResult("Given q is not prime")); } } while (!_kat); var auxValues = new AuxiliaryResult(); var primePair = new PrimePair { P = p, Q = q }; return(new PrimeGeneratorResult(primePair, auxValues)); }