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));
        }
Пример #3
0
        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));
        }
Пример #4
0
        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));
        }
Пример #5
0
 public PrimeGeneratorResult(PrimePair primes, AuxiliaryResult aux)
 {
     Primes    = primes;
     AuxValues = aux;
 }
Пример #6
0
        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));
        }
Пример #7
0
 public KeyResult(KeyPair key, AuxiliaryResult aux)
 {
     Key       = key;
     AuxValues = aux;
 }