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; } } }
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>()); } }
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); } }
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(); }
//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); } }
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++; } } }
/// <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); }
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(); } }
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)); }
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()); }
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()); }
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(); }
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(); } }
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()); }
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); }
////Функция нахождения порядка кривой в афинных координатах //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); }