示例#1
0
        private static BigInteger[] GeneratePrimes(int lengthBits, int count)
        {
            BigInteger       start          = BigInteger.Pow(2, lengthBits - 1);
            BigInteger       finish         = BigInteger.Pow(2, lengthBits) - 1;
            BigInteger       range          = finish - start + 1;
            var              list           = new List <BigInteger>();
            var              checkedNumbers = new List <BigInteger>();
            BigIntegerRandom rand           = new BigIntegerRandom();

            while (checkedNumbers.Count < range && list.Count < count)
            {
                var shift = rand.Next(0, range);
                var temp  = start + shift;
                if (!checkedNumbers.Contains(temp))
                {
                    if (BigIntegerPrimeTest.MillerRabinTest(temp) && temp != 2)
                    {
                        list.Add(temp);
                    }
                    checkedNumbers.Add(temp);
                }
            }
            return(list.ToArray <BigInteger>());
            //listOfArraysOfPrimes.Add(list.ToArray<BigInteger>());
        }
        public static void FirstStep(DLPInput input, BigInteger[] factorBase, ref List <List <BigInteger> > coefficients, ref List <BigInteger> constantTerms)
        {
            var rand = new BigIntegerRandom();

            for (int i = 1; i < input.order; i++)
            {
                //var k = rand.Next(0, input.order);
                //while (k == 0)
                //{
                //    k = rand.Next(0, input.order);
                //}
                var k    = input.order - i;
                var temp = BigInteger.ModPow(input.g, k, input.p);
                var factorBaseFactorizationExponents = Factorization.GetFactorBaseFactorizationExponents(temp, factorBase);
                if (factorBaseFactorizationExponents != null)
                {
                    coefficients.Add(factorBaseFactorizationExponents.ToList());
                    constantTerms.Add(k);

                    //bool isLinearIndependent = GaussianElimination.IsLinearIndependent(coefficients, input.order);
                    //if (!isLinearIndependent)
                    //    coefficients.RemoveAt(coefficients.Count - 1);
                    //else
                    //    constantTerms.Add(k);
                }
                //if (coefficients.Count == factorBase.Length)
                if (coefficients.Count == LinearEquatationsCount)
                {
                    return;
                }
            }
        }
示例#3
0
        public static void GeneratehAndxInFiles(int startBitsLength, int finishBitsLength, int rangeCount)
        {
            BigIntegerRandom rand = new BigIntegerRandom();

            for (int i = startBitsLength; i <= finishBitsLength; i++)
            {
                string       primesPath     = String.Format(@"..\..\..\TestUtility\primes{0}bits.txt", i);
                BigInteger[] primes         = FileUtility.ReadArrayFromFile(primesPath);
                string       generatorsPath = String.Format(@"..\..\..\TestUtility\generators{0}bits.txt", i);
                BigInteger[] generators     = FileUtility.ReadArrayFromFile(generatorsPath);
                var          listH          = new List <BigInteger>();
                var          listX          = new List <BigInteger>();
                for (int j = 0; j < primes.Length && j < rangeCount; j++)
                {
                    var p = primes[j];
                    var g = generators[j];
                    var x = rand.Next(0, p - 1);
                    var h = BigInteger.ModPow(g, x, p);
                    listH.Add(h);
                    listX.Add(x);
                }
                string hPath = String.Format(@"..\..\..\TestUtility\h{0}bits.txt", i);
                FileUtility.WriteArrayInFile(hPath, listH.ToArray <BigInteger>());
                string xPath = String.Format(@"..\..\..\TestUtility\x{0}bits.txt", i);
                FileUtility.WriteArrayInFile(xPath, listX.ToArray <BigInteger>());
            }
        }
示例#4
0
        public static void SolveDLPRange(int startBitLength, int finishBitLength, int count)
        {
            BigIntegerRandom rand = new BigIntegerRandom();

            for (int i = startBitLength; i <= finishBitLength; i++)
            {
                var primes     = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\primes{0}bits.txt", i));
                var generators = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\generators{0}bits.txt", i));
                var text       = "";
                for (int j = 0; j < count; j++)
                {
                    var p = primes[j];
                    var g = generators[j];

                    var log = rand.Next(0, p - 1);
                    var h   = BigInteger.ModPow(g, log, p);

                    var startTime = System.Diagnostics.Stopwatch.StartNew();
                    var x         = DLPAlgorithm.BabyStepGiantStep.SolveDLP(g, h, p);
                    startTime.Stop();
                    var    resultTime  = startTime.Elapsed;
                    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                                                       resultTime.Hours,
                                                       resultTime.Minutes,
                                                       resultTime.Seconds,
                                                       resultTime.Milliseconds);
                    var line = i.ToString() + " " + p.ToString() + " " + g.ToString() + " " + h.ToString() + " " + log.ToString() + " " + x.ToString() + " " + elapsedTime;
                    text += line + Environment.NewLine + Environment.NewLine;
                }
                FileUtility.WriteStringInFile(String.Format(@"..\..\..\DLPUtility\rhopollard{0}bits.txt", i), text);
            }
        }
示例#5
0
        public static void TestBabyStepGiantStep(int startBitLength, int finishBitLength, int count)
        {
            BigIntegerRandom rand = new BigIntegerRandom();

            for (int i = startBitLength; i <= finishBitLength; i++)
            {
                int        tempI = 27;
                BigInteger a     = 19;
                BigInteger b     = 7;
                BigInteger p     = 121572721;
                var        curve = new EllipticCurveUtility.EllipticCurve(a, b, p);
                BigInteger x     = 42812350;
                BigInteger y     = 114715677;
                BigInteger order = 1820539;
                var        point = new EllipticCurveUtility.AffinePoint(x, y, curve);
                var        text  = "";
                for (int j = 0; j < count; j++)
                {
                    var n = rand.Next(0, p - 1);
                    var Q = (n * point.ToProjectivePoint()).ToAffinePoint();

                    var startTime = System.Diagnostics.Stopwatch.StartNew();
                    var log       = ECDLPAlgorithm.BabyStepGiantStep.SolveDLP(point.ToProjectivePoint(), Q.ToProjectivePoint());
                    startTime.Stop();
                    var    resultTime  = startTime.Elapsed;
                    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                                                       resultTime.Hours,
                                                       resultTime.Minutes,
                                                       resultTime.Seconds,
                                                       resultTime.Milliseconds);
                    var line = tempI.ToString() + " " + n.ToString() + " " + log.ToString() + " " + elapsedTime;
                    text += line + Environment.NewLine + Environment.NewLine;
                    //FileUtility.WriteStringInFile(String.Format(@"..\..\..\ECDLPUtility\babystepgiantstep{0}bits.txt", tempI), text);
                    text = "";

                    //startTime = System.Diagnostics.Stopwatch.StartNew();
                    //log = ECDLPAlgorithm.RhoPollard.SolveDLP(point, Q);
                    //startTime.Stop();
                    //resultTime = startTime.Elapsed;
                    //elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                    //    resultTime.Hours,
                    //    resultTime.Minutes,
                    //    resultTime.Seconds,
                    //    resultTime.Milliseconds);
                    //line = tempI.ToString() + " " + n.ToString() + " " + log.ToString() + " " + elapsedTime;
                    //text += line + Environment.NewLine + Environment.NewLine;
                    FileUtility.WriteStringInFile(String.Format(@"..\..\..\ECDLPUtility\rhopollard{0}bits.txt", tempI), text);
                }
                //FileUtility.WriteStringInFile(String.Format(@"..\..\..\ECDLPUtility\babystepgiantstep{0}bits.txt", tempI), text);
            }
            //var excelFile = new ExcelFile();
            //excelFile.ExcelFilePath = String.Format(@"D:\BabyStepGiantStep.xlsx");
            //excelFile.OpenExcel();
            //foreach(var dataColumn in dataSheet)
            //{
            //    excelFile.AddDataToExcel(dataColumn);
            //}
            //excelFile.CloseExcel();
        }
示例#6
0
        //public static void TestIndexCalculus(int startBitLength, int finishBitLength, int count)
        //{
        //    BigIntegerRandom rand = new BigIntegerRandom();
        //    for (int i = startBitLength; i <= finishBitLength; i++)
        //    {
        //        Console.WriteLine(i + " bits");
        //        var primes = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\primes{0}bits.txt", i));
        //        var generators = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\generators{0}bits.txt", i));
        //        var text = "";
        //        for (int j = 0; j < count; j++)
        //        {
        //            var p = primes[j];
        //            var g = generators[j];

        //            var log = rand.Next(0, p - 1);
        //            var h = BigInteger.ModPow(g, log, p);

        //            System.Diagnostics.Stopwatch startTime = System.Diagnostics.Stopwatch.StartNew();
        //            var x = DLPAlgorithm.IndexCalculus.SolveDLP(g, h, p);
        //            var resultTime = startTime.Elapsed;

        //            Console.WriteLine(IndexCalculus.FactorBaseSize + " = " +  IndexCalculus.ReducedFactorBaseSize);
        //            Console.WriteLine(x + " = " + log);
        //            Console.WriteLine(resultTime);

        //            Console.WriteLine();
        //        }

        //    }
        //}


        public static void TestIndexCalculus(int startBitLength, int finishBitLength, int count)
        {
            BigIntegerRandom rand = new BigIntegerRandom();
            int k              = 1;
            int step           = 20;
            int start          = 100;
            int cofLinearCount = 4;

            for (int i = startBitLength; i <= finishBitLength; i++)
            {
                var primes     = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\primes{0}bits.txt", i));
                var generators = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\generators{0}bits.txt", i));
                var text       = "";
                for (int j = 0; j < count; j++)
                {
                    var p = primes[j];
                    var g = generators[j];

                    var log = rand.Next(0, p - 1);
                    var h   = BigInteger.ModPow(g, log, p);

                    IndexCalculus.LinearEquatationsCount = cofLinearCount * IndexCalculus.FactorBaseSize;

                    System.Diagnostics.Stopwatch startTime = null;
                    BigInteger x             = -1;
                    BigInteger startFactBase = 1;
                    while (x == -1)
                    {
                        startTime     = System.Diagnostics.Stopwatch.StartNew();
                        startFactBase = IndexCalculus.FactorBaseSize;
                        x             = DLPAlgorithm.IndexCalculus.SolveDLP(g, h, p);
                        if (x == -1)
                        {
                            IndexCalculus.FactorBaseSize += 5;
                        }
                    }
                    startTime.Stop();

                    var resultTime = startTime.Elapsed;

                    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                                                       resultTime.Hours,
                                                       resultTime.Minutes,
                                                       resultTime.Seconds,
                                                       resultTime.Milliseconds);

                    var line = i.ToString() + " bits,  p = " + p.ToString() + ", g = " + g.ToString() +
                               ", h = " + h.ToString() + " , log = " + log.ToString() + " , x = " + x.ToString() +
                               " , time = " + elapsedTime + " , startFactorBaseSize = " + startFactBase +
                               " , reducedFactorBaseSize = " + IndexCalculus.ReducedFactorBaseSize;

                    text += line + Environment.NewLine + Environment.NewLine;

                    k++;
                }
                FileUtility.WriteStringInFile(String.Format(@"..\..\..\IndexCalculusUtility\indexcalculus{0}bits.txt", i), text);
            }
        }
示例#7
0
        public static void SolveDLPRange(int startBitLength, int finishBitLength, int count)
        {
            Excel.Application excelApp = new Excel.Application();
            Excel.Workbook    workBook;
            Excel.Worksheet   workSheet;
            workBook         = excelApp.Workbooks.Add();
            workSheet        = (Excel.Worksheet)workBook.Worksheets.get_Item(1);
            excelApp.Visible = true;

            int row = 1;

            for (int i = startBitLength; i <= finishBitLength; i++)
            {
                var primes = FileUtility.ReadArrayFromFile(String.Format(@"C:\Utility\ECDLPUtility\Сurves\p{0}bits.txt", i));
                var arrA   = FileUtility.ReadArrayFromFile(String.Format(@"C:\Utility\ECDLPUtility\Сurves\A{0}bits.txt", i));
                var arrB   = FileUtility.ReadArrayFromFile(String.Format(@"C:\Utility\ECDLPUtility\Сurves\B{0}bits.txt", i));

                var arrX = FileUtility.ReadArrayFromFile(String.Format(@"C:\Utility\ECDLPUtility\Points\X{0}bits.txt", i));
                var arrY = FileUtility.ReadArrayFromFile(String.Format(@"C:\Utility\ECDLPUtility\Points\Y{0}bits.txt", i));
                //var arrOrder = FileUtility.ReadArrayFromFile(String.Format(@"C:\Utility\ECDLPUtility\Points\order{0}bits.txt", i));
                //var arrOrderbitslength = FileUtility.ReadArrayFromFile(String.Format(@"C:\Utility\ECDLPUtility\Points\orderbitslength{0}bits.txt", i));

                var A     = arrA[0];
                var B     = arrB[0];
                var p     = primes[0];
                var curve = new EllipticCurveUtility.EllipticCurve(A, B, p);
                var X     = arrX[0];
                var Y     = arrY[0];
                //var order = arrOrder[0];
                //var orderBitsLength = arrOrderbitslength[0];
                var point = new EllipticCurveUtility.AffinePoint(X, Y, curve);

                var rand = new BigIntegerRandom();
                for (int j = 0; j < count; j++)
                {
                    var n   = rand.Next(0, p - 1);
                    var P   = point.ToProjectivePoint();
                    var Q   = (n * P);
                    var log = SolveDLP(P, Q);

                    workSheet.Cells[row, 1] = i.ToString();
                    workSheet.Cells[row, 2] = curve.ToString();
                    workSheet.Cells[row, 3] = P.ToString();
                    workSheet.Cells[row, 4] = Q.ToString();
                    //  workSheet.Cells[row, 5] = order.ToString();
                    //    workSheet.Cells[row, 6] = orderBitsLength.ToString();
                    workSheet.Cells[row, 7]  = TimeInSec.ToString();
                    workSheet.Cells[row, 8]  = n.ToString();
                    workSheet.Cells[row, 9]  = log.ToString();
                    workSheet.Cells[row, 10] = StepsCount.ToString();
                    //workSheet.Cells[row, 11] = RhoPollard.GCD.ToString();

                    row++;
                }
            }
        }
示例#8
0
        /// <summary>
        /// Функция генерирует два случайных числа a и b меньше P, возвращает true в случае подлинности подписи
        /// </summary>
        /// <param name="P">Опубликованное простое число</param>
        /// <param name="G">Порождающий элемент</param>
        /// <param name="X">Закрытый ключ</param>
        /// <param name="Z">Подписанное сообщение</param>
        /// <param name="M">Неподписанное сообщение</param>
        /// <returns></returns>
        static bool Bob(BigInteger P, BigInteger G, BigInteger X, BigInteger Z, BigInteger M)
        {
            BigInteger A = BigIntegerRandom.GenerateRandom(0, P, new Random());

            Thread.Sleep(5);
            BigInteger B       = BigIntegerRandom.GenerateRandom(0, P, new Random());
            BigInteger C       = (BigInteger.ModPow(BigInteger.ModPow(Z, A, P) * BigInteger.ModPow(G, X * B, P), 1, P));
            BigInteger D_Bob   = BigInteger.ModPow(BigInteger.ModPow(M, A, P) * BigInteger.ModPow(G, B, P), 1, P);
            BigInteger D_Alice = Alice(C, P, X);

            return(D_Alice == D_Bob);
        }
示例#9
0
        private void OnGenerateXBtnClick(object sender, RoutedEventArgs e)
        {
            int  p = 1, g = 1;
            bool isValid = int.TryParse(pTxtBox.Text, out p) && int.TryParse(gTxtBox.Text, out g);

            if (isValid)
            {
                var rand = new BigIntegerRandom();
                var x    = rand.Next(0, p - 1);
                var h    = BigInteger.ModPow(g, x, p);
                xTxtBox.Text = x.ToString();
                hTxtBox.Text = h.ToString();
            }
        }
示例#10
0
        public static EllipticCurve GenerateEllipticCurve(BigInteger p)
        {
            BigIntegerRandom rand = new BigIntegerRandom();
            BigInteger       a, b;
            bool             condition;

            do
            {
                a         = rand.Next(0, p);
                b         = rand.Next(0, p);
                condition = (4 * BigInteger.ModPow(a, 3, p) + 27 * BigInteger.ModPow(b, 2, p) % p) != 0 && a != 0 && b != 0;
            } while (!condition);
            return(new EllipticCurve(a, b, p));
        }
示例#11
0
        public static void GeneratePrimesInFiles(int startBitsLength, int finishBitsLength, int rangeCount)
        {
            BigIntegerRandom rand     = new BigIntegerRandom();
            List <Task>      taskList = new List <Task>();

            for (int i = startBitsLength; i <= finishBitsLength; i++)
            {
                string primesPath = String.Format(@"..\..\..\TestUtility\primes{0}bits.txt", i);
                var    tempI      = i;
                taskList.Add(new Task(() => PrimeThreadFunc(primesPath, tempI, rangeCount)));
            }
            foreach (var t in taskList)
            {
                t.Start();
            }
            Task.WaitAll(taskList.ToArray());
        }
示例#12
0
        public static void GenerateGeneratorsInFiles(int startBitsLength, int finishBitsLength)
        {
            BigIntegerRandom rand     = new BigIntegerRandom();
            List <Task>      taskList = new List <Task>();

            for (int i = startBitsLength; i <= finishBitsLength; i++)
            {
                var          tempI          = i;
                BigInteger[] primes         = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\primes{0}bits.txt", tempI));
                string       generatorsPath = String.Format(@"..\..\..\TestUtility\generators{0}bits.txt", tempI);
                taskList.Add(new Task(() => GenerateGenerators(generatorsPath, primes)));
            }
            foreach (var t in taskList)
            {
                t.Start();
            }
            Task.WaitAll(taskList.ToArray());
        }
示例#13
0
        public static void TestRhoPollard(int startBitLength, int finishBitLength, int count)
        {
            BigIntegerRandom rand = new BigIntegerRandom();

            // var dataSheet = new List<string[]>();
            for (int i = startBitLength; i <= finishBitLength; i++)
            {
                var primes     = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\primes{0}bits.txt", i));
                var generators = FileUtility.ReadArrayFromFile(String.Format(@"..\..\..\TestUtility\generators{0}bits.txt", i));
                var text       = "";
                for (int j = 0; j < count; j++)
                {
                    var p = primes[j];
                    var g = generators[j];

                    var log = rand.Next(0, p - 1);
                    var h   = BigInteger.ModPow(g, log, p);

                    var startTime = System.Diagnostics.Stopwatch.StartNew();
                    var x         = DLPAlgorithm.RhoPollard.SolveDLP(g, h, p);
                    startTime.Stop();
                    var    resultTime  = startTime.Elapsed;
                    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                                                       resultTime.Hours,
                                                       resultTime.Minutes,
                                                       resultTime.Seconds,
                                                       resultTime.Milliseconds);
                    var line = i.ToString() + " " + p.ToString() + " " + g.ToString() + " " + h.ToString() + " " + log.ToString() + " " + x.ToString() + " " + elapsedTime;
                    text += line + Environment.NewLine + Environment.NewLine;
                    //var dataColumn = new string[] { i.ToString(), p.ToString(), g.ToString(), h.ToString(), log.ToString(), x.ToString(), elapsedTime };
                    //dataSheet.Add(dataColumn);
                }
                FileUtility.WriteStringInFile(String.Format(@"..\..\..\DLPUtility\rhopollard{0}bits.txt", i), text);
            }
            //var excelFile = new ExcelFile();
            //excelFile.ExcelFilePath = String.Format(@"D:\BabyStepGiantStep.xlsx");
            //excelFile.OpenExcel();
            //foreach(var dataColumn in dataSheet)
            //{
            //    excelFile.AddDataToExcel(dataColumn);
            //}
            //excelFile.CloseExcel();
        }
示例#14
0
        private void OnGeneratePBtnClick(object sender, RoutedEventArgs e)
        {
            int  bitsLength = 1;
            bool isValid    = int.TryParse(bitsLengthTxtBox.Text, out bitsLength);

            if (isValid)
            {
                var        rand   = new BigIntegerRandom();
                BigInteger start  = BigInteger.Pow(2, bitsLength - 1);
                BigInteger finish = BigInteger.Pow(2, bitsLength) - 1;
                BigInteger range  = finish - start + 1;
                BigInteger p      = 1;
                do
                {
                    var shift = rand.Next(0, range);
                    p = start + shift;
                }while (BigIntegerPrimeTest.MillerRabinTest(p));
                pTxtBox.Text = p.ToString();
            }
        }
示例#15
0
        public AffinePoint GetRandomAffinePoint()
        {
            BigIntegerRandom rand = new BigIntegerRandom();
            var        start      = rand.Next(0, P);
            var        x          = start;
            BigInteger t;

            do
            {
                t = (x * (x * x + A) + B).ModPositive(P);
                if (BigIntegerExtension.JacobiSymbol(t, P) != -1)
                {
                    return(new AffinePoint(x, BigIntegerExtension.Sqrt(t).ModPositive(P), this));
                }
                if (x > P - 1)
                {
                    x = -1;
                }
                x++;
            }while (x != start);
            return(GetInfiniteAffinePoint());
        }
示例#16
0
        static void Main(string[] args)
        {
            int Nice             = 0;
            int NotNice          = 0;
            BigIntegerRandom BIR = new BigIntegerRandom();

            DigitalSignature NewSignature = new DigitalSignature(64); //p,g
                                                                      //Console.WriteLine("i=={0,3} G=={1}", i,NewSignature.G);

            BigInteger X;

            do
            {
                X = BIR.GenerateSimple(64);
                if (GCDEX.GetX(X, NewSignature.P - 1) > 0)
                {
                    break;
                }
            } while (true);
            //Закрытый ключ
            BigInteger M = BigInteger.Parse("465498132");           //Исходное сообщение
            BigInteger Z = BigInteger.ModPow(M, X, NewSignature.P); //Подписанное сообщение

            for (int i = 0; i < 10; i++)
            {
                if (Bob(NewSignature.P, NewSignature.G, X, Z, M))
                {
                    Nice++;
                }
                else
                {
                    NotNice++;
                }
            }

            Console.WriteLine("Nice=={0}\nNotNice=={1}", Nice, NotNice);
        }
示例#17
0
        ////Функция нахождения порядка кривой в афинных координатах
        //public static BigInteger FindOrder(EllipticCurve E)
        //{
        //    var Z = E.P;
        //    var rand = new Random();
        //    var startPoint = BasePoint.RandomPoint<PointAffine>(E);
        //    // Найдем границы по теореме Хассе
        //    var leftBorder = Z + 1 - 2 * (FieldsOperations.Sqrt(Z));
        //    var rightBorder = Z + 1 + 2 * (FieldsOperations.Sqrt(Z));
        //    for (int c = 0; c < NUMBER_OF_ATTEMPTS; c++)
        //    {
        //        //Сгенерируем точку на кривой и найдем ее порядок
        //        var P = BasePoint.RandomPoint<PointAffine>(E);
        //        var M = E.FindPointOrder(P);
        //        startPoint = P;
        //        if (M == 0)
        //            continue;
        //        int countOfDevided = 0;
        //        var order = BigInteger.Zero;
        //        //Найдем число делителей порядка точки в границах
        //        for (var i = leftBorder; i < rightBorder; )
        //        {
        //            if (i % M == 0)
        //            {
        //                order = i;
        //                i += M;
        //                countOfDevided++;
        //                if (countOfDevided > 1)
        //                    break;
        //            }
        //            else
        //            {
        //                i++;
        //            }
        //        }
        //        //Если оно равно единице, то порядок кривой - делитель порядка точки
        //        if (countOfDevided == 1)
        //        {
        //            E.Order = order;
        //            return order;
        //        }
        //    }
        //    return 0;
        //}

        public static BigInteger FindPointOrder(AffinePoint P)
        {
            var point = P;
            //var rand = new Random();
            var        rand = new BigIntegerRandom();
            BigInteger M    = 0;
            //Создаем список точек
            var A = new List <AffinePoint>();
            var Q = (P.E.P + 1) * point;

            A.Add(new AffinePoint());
            A[0].X = 0;
            A[0].Y = 0;
            A[0].Z = 1;
            A[0].E = P.E;
            A.Add(point);
            var max   = BigInteger.One;
            int count = 0;

            for (; count < P.E.P; count++)
            {
                M = 0;
                // генерерируем число m
                var m = BigIntegerExtension.Sqrt(BigIntegerExtension.Sqrt(P.E.P)) + 1 + rand.Next(0, P.E.P);
                if (m > max)
                {
                    //дозаполняем список
                    for (BigInteger i = 0; i < m - max; i++)
                    {
                        A.Add(point + A[A.Count - 1]);
                    }
                    max = m;
                }
                var  k     = -m - 1;
                int  j     = 0;
                bool flag  = true;
                var  twoMP = (2 * m) * point;
                var  temp  = Q + (k * twoMP);
                k++;
                //вычисляем параметры k и j
                for (; k < m && flag; k++)
                {
                    if (k < 0 && k != -m)
                    {
                        temp = temp - twoMP;
                    }
                    else
                    {
                        temp = temp + twoMP;
                    }

                    for (j = 0; j < A.Count && flag; j++)
                    {
                        if (temp == A[j])
                        {
                            j    = -j;
                            flag = false;
                            break;
                        }
                        if (temp == (-A[j]))
                        {
                            flag = false;
                            break;
                        }
                    }
                }
                k--;
                M = (P.E.P + 1 + 2 * m * k + j);
                if ((M * point) == P.E.GetInfiniteAffinePoint() && M != 0)
                {
                    break;
                }
            }
            if (count == P.E.P)
            {
                return(0);
            }
            // Раскладываем число M ро-методом Полларда
            List <BigInteger> factorsM;

            try
            {
                factorsM = BigIntegerExtension.PollardsAlg(BigInteger.Abs(M));
            }
            catch (Exception)
            {
                return(0);
            }
            // Проверяем простые делители числа M
            for (int i = 0; i < factorsM.Count;)
            {
                BigInteger temp = M / factorsM[i];
                if (M != factorsM[i] && M % factorsM[i] == 0 && (temp * point) == P.E.GetInfiniteAffinePoint())
                {
                    M = temp;
                    i = 0;
                }
                else
                {
                    i++;
                }
            }
            //P.Order = M;
            return(M);
        }