コード例 #1
0
ファイル: PolynomialMethods.cs プロジェクト: Tgjmjgj/edsa
        public List <BigInteger> PolyMulMod(BigInteger p, List <BigInteger> a, List <BigInteger> b)
        {
            int               i, j, k, m = a.Count - 1, n = b.Count - 1, q = m + n;
            BigInteger        ai = 0, bj = 0, sum = 0;
            List <BigInteger> c = new List <BigInteger>();

            for (k = 0; k <= q; k++)
            {
                sum = 0;
                for (i = 0; i <= k; i++)
                {
                    j = k - i;
                    if (i > m)
                    {
                        ai = 0;
                    }
                    else
                    {
                        ai = a[i];
                    }
                    if (j > n)
                    {
                        bj = 0;
                    }
                    else
                    {
                        bj = b[j];
                    }
                    sum = Maths.AddMod(sum, Maths.MulMod(ai, bj, p), p);
                }
                c.Add(sum);
            }
            return(c);
        }
コード例 #2
0
ファイル: EllipticCurve.cs プロジェクト: Tgjmjgj/edsa
        public BigInteger Weierstrass(BigInteger x)
        {
            BigInteger t3 = BigInteger.ModPow(x, 3, p);
            BigInteger t1 = Maths.MulMod(a, x, p);
            BigInteger t2 = Maths.AddMod(t3, t1, p);

            return(Maths.AddMod(t2, b, p));
        }
コード例 #3
0
ファイル: PolynomialMethods.cs プロジェクト: Tgjmjgj/edsa
        private BigInteger Horner(BigInteger p, BigInteger x, List <BigInteger> P)
        {
            BigInteger s = P[P.Count - 1], t = 0;

            for (int i = P.Count - 2; i >= 0; i--)
            {
                t = Maths.MulMod(s, x, p);
                s = Maths.AddMod(t, P[i], p);
            }
            return(s);
        }
コード例 #4
0
        public static BigInteger GetInverse(BigInteger a, BigInteger m)
        {
            BigInteger x, y;
            BigInteger g   = GCD(a, m, out x, out y);
            BigInteger ret = new BigInteger();

            if (g == 1)
            {
                ret = Maths.AddMod(x % m, m, m);
            }
            else
            {
                ret = 0;
            }
            return(ret);
        }
コード例 #5
0
ファイル: PolynomialMethods.cs プロジェクト: Tgjmjgj/edsa
        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);
                }
            }
        }