Point IntegerEncoding(BigInteger m_value, BigInteger k_value) { var m = new FiniteFieldElement(m_value, _curve.Prime); var k = new FiniteFieldElement(k_value, _curve.Prime); var a = new FiniteFieldElement(_curve.A, _curve.Prime); var b = new FiniteFieldElement(_curve.B, _curve.Prime); //cache m*k var m_times_k = m * k; FiniteFieldElement x; FiniteFieldElement y; for (BigInteger j_value = BigInteger.Zero; j_value < k_value; j_value++) { var j = new FiniteFieldElement(j_value, _curve.Prime); x = (m_times_k + j); //z = x^3+ax+b var z = (x^3) + (a*x) + b; //sqrt mod p if (z.TrySqrt(out y)) { return new WeierstrassCurvePoint(x.Value, y.Value, _curve); } } throw new ArgumentException("Could not encode m as point on curve. Probablistic mapping failed.", "m_value"); }
FiniteFieldElement NonLinearCombiner(FiniteFieldElement X1, FiniteFieldElement X2, FiniteFieldElement X3, FiniteFieldElement X4) { return((X1 * X3) + (X2 * X4)); }