コード例 #1
0
        //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);
        }