Beispiel #1
0
        public bool SingVer(byte[] H, string sing, EllipticCurve_Point Q)
        {
            int        midl    = Maths.Length(this.curv.N) / 4;
            string     Rvector = sing.Substring(0, midl);
            string     Svector = sing.Substring(midl, midl);
            BigInteger r       = BigInteger.Parse(SupportEDS.DecStringFromHexString(Rvector));
            BigInteger s       = BigInteger.Parse(SupportEDS.DecStringFromHexString(Svector));

            if ((r < 1) || (r > (this.curv.N - 1)) || (s < 1) || (s > (this.curv.N - 1)))
            {
                return(false);
            }
            BigInteger alpha = BigInteger.Parse(SupportEDS.DecStringFromByteArray(H));
            BigInteger e     = alpha % this.curv.N;

            if (e == 0)
            {
                e = 1;
            }
            BigInteger          v  = Maths.GetInverse(e, this.curv.N);
            BigInteger          z1 = (s * v) % this.curv.N;
            BigInteger          z2 = this.curv.N + ((-(r * v)) % this.curv.N);
            EllipticCurve_Point A  = new EllipticCurve_Point();
            EllipticCurve_Point B  = new EllipticCurve_Point();
            EllipticCurve_Point C  = new EllipticCurve_Point();

            curv.Mult(z1, this.curv.G, ref A);
            curv.Mult(z2, Q, ref B);
            curv.Sum(A, B, ref C);
            BigInteger R = C.X % this.curv.N;

            if (R == r)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Beispiel #2
0
        public bool Sum(EllipticCurve_Point p1, EllipticCurve_Point p2, ref EllipticCurve_Point res)
        {
            BigInteger lambda = -1;

            if (p1.IsNull && p2.IsNull)
            {
                res = EllipticCurve.O;
                return(true);
            }
            BigInteger ps = (p - p2.Y) % p;

            if (p1.X == p2.X && p1.Y == ps)
            {
                res = EllipticCurve.O;
                return(true);
            }
            if (p1.IsNull)
            {
                res = new EllipticCurve_Point(p2);
                return(true);
            }
            if (p2.IsNull)
            {
                res = new EllipticCurve_Point(p1);
                return(true);
            }
            if (p1.X != p2.X)
            {
                BigInteger i = (p2.X - p1.X) % p;
                BigInteger y = (p2.Y - p1.Y) % p;
                if (i < 0)
                {
                    i += p;
                }
                i = Maths.GetInverse(i, p);
                if (i == 0)
                {
                    return(false);
                }
                lambda = (i * y) % p;
            }
            else
            {
                BigInteger y2 = (2 * p1.Y) % p;
                BigInteger i  = Maths.GetInverse(y2, p);
                if (i < 0)
                {
                    i += p;
                }
                if (i == 0)
                {
                    return(false);
                }
                BigInteger x3 = (3 * p1.X) % p;
                x3     = (x3 * p1.X) % p;
                x3     = (x3 + a) % p;
                lambda = (x3 * i) % p;
            }
            res = new EllipticCurve_Point();
            BigInteger lambda2 = (lambda * lambda) % p;
            BigInteger delta1  = (p1.X + p2.X) % p;

            res.X = (lambda2 - delta1) % p;
            BigInteger delta2 = (p1.X - res.X) % p;

            delta2 = (lambda * delta2) % p;
            res.Y  = (delta2 - p1.Y) % p;
            if (res.X < 0)
            {
                res.X += p;
            }
            if (res.Y < 0)
            {
                res.Y += p;
            }
            return(true);
        }
Beispiel #3
0
        private void Recurse(BigInteger p, List <BigInteger> A, ref List <BigInteger> root)
        {
            int               count = 0, degreeA = A.Count - 1, degreeB = 0;
            BigInteger        exp = 0, p1 = p - 1, D = 0, a = 0, b = 0, c = 0, e = 0;
            List <BigInteger> B = null, d = null;
            List <BigInteger> q = null, r = null, u = null;

            exp = p1 / 2;
            if (degreeA != 0)
            {
                if (degreeA == 1)
                {
                    if (A[0] != 0)
                    {
                        a = Maths.GetInverse(A[1], p);
                        b = A[0];
                        b = -b;
                        b = Maths.MulMod(b, a, p);
                        root.Add(b);
                    }
                }
                else if (degreeA == 2)
                {
                    a = Maths.MulMod(A[1], A[1], p);
                    b = Maths.MulMod(A[0], A[2], p);
                    c = Maths.MulMod(b, 4, p);
                    D = Maths.SubMod(a, c, p);
                    e = hcr.SquareRootModPrime(D, p);
                    BigInteger test = (e * e) % p;
                    if (e == 1)
                    {
                        return;
                    }
                    a = Maths.MulMod(A[2], 2, p);
                    D = Maths.GetInverse(a, p);
                    if (D == 0)
                    {
                        a = -a;
                        a = Maths.AddMod(a, p, p);
                        D = Maths.GetInverse(a, p);
                    }
                    a = Maths.SubMod(e, A[1], p);
                    root.Add(Maths.MulMod(a, D, p));
                    A[1] = -A[1];
                    e    = -e;
                    a    = Maths.AddMod(A[1], e, p);
                    root.Add(Maths.MulMod(a, D, p));
                }
                else
                {
                    do
                    {
                        count++;
                        a = hcr.RandomRange(0, p1);
                        u = new List <BigInteger>();
                        u.Add(a);
                        u.Add(1);
                        PolyPowMod(p, exp, u, A, ref d);
                        if (d.Count - 1 != 0)
                        {
                            d[0] = Maths.SubMod(d[0], 1, p);
                            B    = PolyGCDMod(p, d, A);
                            if (B.Count == 1 && B[0] == 1)
                            {
                                return;
                            }
                            degreeB = B.Count - 1;
                        }
                    }while (count < 16 && degreeB == 0 || degreeB == degreeA);
                    if (count == 16)
                    {
                        return;
                    }
                    Recurse(p, B, ref root);
                    PolyDivMod(p, A, B, ref q, ref r);
                    Recurse(p, q, ref root);
                }
            }
        }