示例#1
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++;
                }
            }
        }
示例#2
0
        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));
        }
示例#3
0
 public ProjectivePoint(BigInteger X, BigInteger Y, BigInteger Z, EllipticCurve E)
     : base(X, Y, Z)
 {
     this.E = E;
 }
示例#4
0
 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));
 }