예제 #1
0
        public CurvePoint(EllypticCurve curve, Point point, BigInteger?orderOfGroup = default(BigInteger?))
        {
            if (curve.IsOnCurve(point))
            {
                Console.WriteLine($"Point {point} is on curve {curve.Coefficient}, {curve.Constant}");
            }
            else
            {
//                throw new ArgumentException($"Point {point} is not on curve {curve.Coefficient}, {curve.Constant}");
                Console.WriteLine($"Point {point} is not on curve {curve.Coefficient}, {curve.Constant}");
            }

            Curve = curve;
            Point = point;

            if (orderOfGroup.HasValue)
            {
                Order = orderOfGroup.Value;
            }
            else
            {
                Order = FindOrderOfGroup();
                Console.WriteLine($"Order of group is calculated {Order}");
            }
        }
예제 #2
0
        public static CurvePoint SimpleGenerator()
        {
            var curve = EllypticCurve.CreateWeierstrass(0, 7, new BigInteger(199));
            var g     = new Point(
                new BigInteger(2),
                new BigInteger(24));

            return(new CurvePoint(curve, g));
        }
예제 #3
0
        public static CurvePoint BitCoinGenerator()
        {
            var curve = EllypticCurve.CreateWeierstrass(0, 7, Configurations.MathConfiguration.GenerateSECP256K1());

            var g = new Point(
                BigInteger.Parse("55066263022277343669578718895168534326250603453777594175500187360389116729240"),
                BigInteger.Parse("32670510020758816978083085130507043184471273380659243275938904335757337482424"));

            return(new CurvePoint(curve, g,
                                  BigIntegerExtensions.FromBigEndianHexString("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141")));
        }
예제 #4
0
        public static CurvePoint NIST121P192Generator()
        {
            var curve = EllypticCurve.CreateWeierstrass(
                new BigInteger(-3),
                BigIntegerExtensions.FromBigEndianHexString("64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1"),
                BigInteger.Parse("6277101735386680763835789423207666416083908700390324961279"));

            var g = new Point(
                BigIntegerExtensions.FromBigEndianHexString("188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012"),
                BigIntegerExtensions.FromBigEndianHexString("07192b95ffc8da78631011ed6b24cdd573f977a11e794811"));

            return(new CurvePoint(curve, g,
                                  BigInteger.Parse("6277101735386680763835789423176059013767194773182842284081")));
        }
예제 #5
0
        public static Point CalculateAddition(this EllypticCurve curve, Point p1, Point p2)
        {
            var beta = default(BigInteger);

            if (p1 != null && p1.Equals(p2))
            {
                beta = curve.CalculateBeta(p1);
            }
            else if (p1 != null && p2 != null)
            {
                beta = curve.CalculateBeta(p1, p2);
            }
            else
            {
                throw new ArgumentException();
            }

            var x = curve.CalculateAdditionXCoordinate(beta, p1, p2);
            var y = curve.CalculateAdditionYCoordinate(beta, p1, x);

            return(new Point(x.ToPositiveMod(curve.Modulo), y.ToPositiveMod(curve.Modulo)));
        }
예제 #6
0
        public static Point CalculateMultiplication(this EllypticCurve curve, Point g, BigInteger scalar)
        {
            var binary = scalar.ToBinaryString();

            binary = binary.TrimStart('0');

            var p = new Point(g.XCoordinate, g.YCoordinate);

            for (var i = 1; i < binary.Length; i++)
            {
                bool add = binary[i] == '1';

                p = curve.CalculateDoubling(p);

                if (add)
                {
                    p = curve.CalculateAddition(p, g);
                }
            }

            return(p);
        }
예제 #7
0
 public static Point CalculateDoubling(this EllypticCurve curve, Point p)
 {
     return(curve.CalculateAddition(p, p));
 }