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++; } } }
public static ProjectivePoint operator +(ProjectivePoint P1, ProjectivePoint P2) { BigInteger X1 = P1.X, Y1 = P1.Y, Z1 = P1.Z; BigInteger X2 = P2.X, Y2 = P2.Y, Z2 = P2.Z; BigInteger MOD = P1.E.P; if ((P1.X == P1.Z) && (P1.X == 0)) { return(P2); } if ((P2.X == P2.Z) && (P2.X == 0)) { return(P1); } BigInteger A = P2.Y * P1.Z - P1.Y * P2.Z; A = A.ModPositive(MOD); BigInteger B = P2.X * P1.Z - P1.X * P2.Z; B = B.ModPositive(MOD); BigInteger C = P2.X * P1.Z + P1.X * P2.Z; C = C.ModPositive(MOD); BigInteger D = P2.X * P1.Z + 2 * P1.X * P2.Z; D = D.ModPositive(MOD); BigInteger E = P2.Z * P1.Z; E = E.ModPositive(MOD); BigInteger X = B * (E * A * A - C * B * B); X = X.ModPositive(MOD); BigInteger Y = A * (B * B * D - A * A * E) - P1.Y * P2.Z * B * B * B; Y = Y.ModPositive(MOD); BigInteger Z = B * B * B * E; Z = Z.ModPositive(MOD); if (X == 0 && Z == 0) { return(new ProjectivePoint(0, 1, 0, P1.E)); } return(new ProjectivePoint(X, Y, Z, P1.E)); }
public ProjectivePoint(BigInteger X, BigInteger Y, BigInteger Z, EllipticCurve E) : base(X, Y, Z) { this.E = E; }
public static ProjectivePoint GetInfinitePointForCurve(EllipticCurve E) { return(new ProjectivePoint(0, 1, 0, E)); }
public AffinePoint(BigInteger X, BigInteger Y, BigInteger Z, EllipticCurve E) : this(X, Y, E) { this.Z = Z; }
public AffinePoint(BigInteger X, BigInteger Y, EllipticCurve E) : this(X, Y) { this.E = E; }
public static AffinePoint GetInfinitePointForCurve(EllipticCurve E) { return(new AffinePoint(0, 1, 0, E)); }