Esempio n. 1
0
        public static EllipticCurveEdwards GenerateCurve12(BigInteger n, out BigInteger x, out BigInteger y)// Z/12Z
        {
            var         E = new EllipticCurveWeierstrass(-12, 0, n);
            PointAffine P;
            BigInteger  d;

            while (true)
            {
                P = new PointAffine(6, -12, E);
                BigInteger k = new Random().Next() % n;
                P = k * P;
                if ((P.x == 0 && P.y == 0) || (P.x == -2 && BigInteger.Abs(P.y) == 4) || (P.x == 6 && BigInteger.Abs(P.y) == 12))
                {
                    continue;
                }

                BigInteger temp = (1024 * P.x * P.x * P.y * P.y) % n;
                BigInteger inv  = Algorithms.Invert(temp, n);
                if (temp * inv % n != 1)
                {
                    continue;
                }
                temp = (-BigInteger.ModPow(P.x - 2, 3, n) * BigInteger.ModPow(P.x + 6, 3, n) * (P.x * P.x - 12 * P.x - 12)) % n;
                if (temp < 0)
                {
                    temp += n;
                }
                d = (temp * inv) % n;

                temp = ((P.x - 2) * (P.x + 6) * (P.x * P.x + 12 * P.x - 12)) % n;
                if (temp < 0)
                {
                    temp += n;
                }
                inv = Algorithms.Invert(temp, n);
                if (temp * inv % n != 1)
                {
                    continue;
                }
                x = (8 * P.y * (P.x * P.x + 12) * inv) % n;

                temp = ((P.x - 2) * (P.x + 6) * (P.x * P.x - 12)) % n;
                if (temp < 0)
                {
                    temp += n;
                }
                inv = Algorithms.Invert(temp, n);
                if (temp * inv % n != 1)
                {
                    continue;
                }
                y = (-4 * P.x * (P.x * P.x - 12 * P.x - 12) * inv) % n;

                break;
            }

            return(new EllipticCurveEdwards(1, d, n));
        }
Esempio n. 2
0
        public static EllipticCurveEdwards GenerateCurve2x8(BigInteger n, out BigInteger x, out BigInteger y)// Z/2Z x Z/8Z
        {
            var         E = new EllipticCurveWeierstrass(-8, -32, n);
            PointAffine P;
            BigInteger  d;

            while (true)
            {
                P = new PointAffine(12, 40, E);
                BigInteger k = new Random().Next() % n;
                P = k * P;

                BigInteger temp = (P.x - 9) % n;
                if (temp < 0)
                {
                    temp += n;
                }
                BigInteger inv = Algorithms.Invert(temp, n);
                if (temp * inv % n != 1)
                {
                    continue;
                }
                temp = ((P.y + 25) * inv + 1) % n;
                if (temp < 0)
                {
                    temp += n;
                }
                BigInteger a = Algorithms.Invert(temp, n);
                if (temp * a % n != 1)
                {
                    continue;
                }

                temp = (8 * a * a - 1) % n;
                if (temp < 0)
                {
                    temp += n;
                }
                inv = Algorithms.Invert(temp, n);
                if (temp * inv % n != 1)
                {
                    continue;
                }
                BigInteger b = (2 * a * (4 * a + 1) * inv) % n;

                temp = BigInteger.ModPow(2 * b - 1, 4, n);
                if (temp < 0)
                {
                    temp += n;
                }
                inv = Algorithms.Invert(temp, n);
                if (temp * inv % n != 1)
                {
                    continue;
                }
                d = ((2 * (2 * b - 1) * (2 * b - 1) - 1) * inv) % n;

                temp = (6 * b - 5) % n;
                if (temp < 0)
                {
                    temp += n;
                }
                inv = Algorithms.Invert(temp, n);
                if (temp * inv % n != 1)
                {
                    continue;
                }
                x = ((2 * b - 1) * (4 * b - 3) * inv) % n;

                temp = ((P.y + 3 * P.x - 2) * (P.y + P.x + 16)) % n;
                if (temp < 0)
                {
                    temp += n;
                }
                inv = Algorithms.Invert(temp, n);
                if (temp * inv % n != 1)
                {
                    continue;
                }
                y = ((2 * b - 1) * (P.y * P.y + 50 * P.y - 2 * P.x * P.x * P.x + 27 * P.x * P.x - 104) * inv) % n;
                break;
            }

            return(new EllipticCurveEdwards(1, d, n));
        }