//public static BigInteger SolveDLP(AffinePoint P, AffinePoint Q) //{ // var order = P.E.HasseTheorem(); // var babySteps = new Dictionary<AffinePoint, BigInteger>(); // var m = BigIntegerExtension.Sqrt(order) + 1; // AffinePoint babyStep; // for (BigInteger i = 0; i < m; i++) // { // babyStep = (i * P.ToProjectivePoint()).ToAffinePoint(); // babySteps.Add(babyStep, i); // Console.WriteLine(babyStep); // } // AffinePoint temp; // ProjectivePoint giantStep = (m * P.ToProjectivePoint()); // for (BigInteger j = 0; j < m; j++) // { // temp = (Q.ToProjectivePoint() - j * giantStep).ToAffinePoint(); // Console.WriteLine(temp); // BigInteger i = -1; // try // { // i = babySteps[temp]; // } // catch (KeyNotFoundException e) { } // if (i != -1) // return BigIntegerExtension.ModPositive(i + j * m, order); // } // return -1; //} public static BigInteger SolveDLP(ProjectivePoint P, ProjectivePoint Q) { var order = P.E.HasseTheorem(); var babySteps = new Dictionary <AffinePoint, BigInteger>(); var m = BigIntegerExtension.Sqrt(order) + 1; AffinePoint babyStep; for (BigInteger i = 0; i <= m; i++) { babyStep = (i * P).ToAffinePoint(); babySteps.Add(babyStep, i); //Console.WriteLine(babyStep); } AffinePoint temp; ProjectivePoint giantStep = (m * P); //Console.WriteLine(); //Console.WriteLine(giantStep.ToAffinePoint()); //Console.WriteLine(); for (BigInteger j = 0; j <= m; j++) { temp = (Q - j * giantStep).ToAffinePoint(); // Console.WriteLine(temp); BigInteger i = -1; try { i = babySteps[temp]; } catch (KeyNotFoundException e) { } if (i != -1) { //Console.WriteLine(temp + " dfsd"); return(BigIntegerExtension.ModPositive(i + j * m, order)); } } //make modification with m/2 and +-iP return(-1); }