Esempio n. 1
0
        // Решаем квадратное уравнение z^2 + uz = w
        static F2mFieldElement quadraticEquation(F2mCurve curve, BigInteger u, BigInteger w)
        {
            // !!!!!!!!!!!!!! ВАЖНО! ПРОПУСКАЕМ 1 и 2: случаи когда u или w равны нулю

            var w__element = new F2mFieldElement(curve.M, curve.K1, curve.K2, curve.K3, w);
            var u__element = new F2mFieldElement(curve.M, curve.K1, curve.K2, curve.K3, u);

            var u2__element = u__element.Invert().Square();

            // 3. Вычисляем элемент основного поля v = w * u ^ -2
            var v = (F2mFieldElement)w__element.Multiply(u2__element);

            // 4. Вычисляем след элемента
            var tr__element = trace(v);

            // 5. ПРОПУСКАЕМ!!! если tr = 1

            // 6. Вычисляем полуслед элемента

            var t__element = halfTrace(v);

            // 7. Вычисляем элемент основного поля z = t * u

            var z__element = (F2mFieldElement)t__element.Multiply(u__element);

            return(z__element);
        }
Esempio n. 2
0
        // 6.8. Вычисление случайной точки эллиптической кривой
        static F2mPoint computeRandomPoint(F2mCurve curve)
        {
            // 1. Вычислим случайный элемент основного поля
            BigInteger u = RNG.GetRandomInteger(curve.M);

            var u__element = new F2mFieldElement(curve.M, curve.K1, curve.K2, curve.K3, u);


            var a__element = new F2mFieldElement(curve.M, curve.K1, curve.K2, curve.K3, curve.A.ToBigInteger());
            var b__element = new F2mFieldElement(curve.M, curve.K1, curve.K2, curve.K3, curve.B.ToBigInteger());

            var au__element = u__element.Multiply(u__element).Multiply(a__element);

            // 2. Вычисляем элемент основного поля w = u ^ 3 + A u ^ 2 + B
            var w__element = u__element.Multiply(u__element).Multiply(u__element).Add(au__element).Add(b__element);

            // 3. Решаем квадратное уравнение z^2 + uz = w
            var z__element = quadraticEquation(curve, u__element.ToBigInteger(), w__element.ToBigInteger());

            // 5. Принимают x = u, y = z
            var point = new F2mPoint(curve, u__element, z__element);

            return(point);
        }