public static EllipticCurvePoint Double(EllipticCurvePoint point) { var result = new EllipticCurvePoint(point.curve); var P = point.P; var A = point.curve.A; var lambda = (3 * point.X * point.X + A) * ((2 * point.Y).ModInverse(P)) % P; result.X = (lambda * lambda - 2 * point.X) % P; result.Y = (lambda * (point.X - result.X) - point.Y) % P; result.X += result.X < 0 ? P : 0; result.Y += result.Y < 0 ? P : 0; return(result); }
public static EllipticCurvePoint operator *(EllipticCurvePoint point, int d) { if (d < 0) { Console.WriteLine("Error: In multiply on N, N is less 0"); return(point); } var binaryString = Convert.ToString(d, 2); var result = new EllipticCurvePoint(point); for (var i = 1; i < binaryString.Length; i++) { result = Double(result); if (binaryString[i] == '1') { result = result + point; } } return(result); }
public EllipticCurvePoint Multiply(BigInteger N) { var curvePoint = this; if (N < 0) { Console.WriteLine("Error: In multiply on N, N is less 0"); return(curvePoint); } var binaryString = N.ToBinaryString(); var result = new EllipticCurvePoint(curvePoint); for (var i = 1; i < binaryString.Length; i++) { result = Double(result); if (binaryString[i] == '1') { result = result + curvePoint; } } return(result); }
public EllipticCurvePoint(EllipticCurvePoint point) { curve = point.curve; this.point = point.point; }