Exemple #1
0
        public static PointMontgomery Addition(PointMontgomery P, PointMontgomery Q, PointMontgomery P0)//4M + 2S + 6add
        {
            BigInteger t1 = (P.x - P.z) * (Q.x + Q.z);
            BigInteger t2 = (P.x + P.z) * (Q.x - Q.z);
            BigInteger a  = t1 + t2;
            BigInteger b  = t1 - t2;
            BigInteger x  = (P0.z * a * a) % P.E.n;
            BigInteger z  = (P0.x * b * b) % P.E.n;

            return(new PointMontgomery(x, 0, z, P.E));
        }
Exemple #2
0
        public static PointMontgomery Double(PointMontgomery P)//2M + 2S + 1*a24 + 4add
        {
            BigInteger a  = P.x + P.z;
            BigInteger b  = P.x - P.z;
            BigInteger t1 = a * a;
            BigInteger t2 = b * b;
            BigInteger t  = t1 - t2;
            BigInteger x  = (t1 * t2) % P.E.n;
            BigInteger z  = (t * (t2 + t * P.E.b)) % P.E.n;

            return(new PointMontgomery(x, 0, z, P.E));
        }
Exemple #3
0
        public static BigInteger GetFactorProjective(BigInteger n, int B1, int B2, TorsionType type)
        {
            BigInteger x;
            BigInteger y;
            var        E = GenerateCurve(n, out x, out y, type);
            var        P = new PointMontgomery(x, y, E);
            //STEP 1
            var P1     = P as IPoint;
            var result = StageOneProjective(ref P1, n, B1);

            if (result > 1 || result == 0)
            {
                return(result);
            }

            //STEP 2
            result = StageTwoProjective2(ref P1, n, B1, B2);

            return(result);
        }//Montgomery
Exemple #4
0
        public static PointMontgomery operator *(BigInteger k, PointMontgomery P)
        {
            if (k == 0)
            {
                return(new PointMontgomery(0, 1, 0, P.E));
            }
            else if (k == 1)
            {
                return(P);
            }
            PointMontgomery U = P;
            PointMontgomery T = Double(P);

            if (k == 2)
            {
                return(T);
            }
            var binary = new List <BigInteger>();

            while (k >= 2)
            {
                binary.Add(k % 2);
                k /= 2;
            }
            PointMontgomery R = P;

            for (int i = binary.Count - 1; i >= 0; i--)
            {
                if (binary[i] == 1)
                {
                    U = Addition(T, U, P);
                    T = Double(T);
                }
                else
                {
                    T = Addition(T, U, P);
                    U = Double(U);
                }
            }
            return(U);
        }