/// <summary> /// Generates a random private-public key pair. /// </summary> /// <returns>The tuple consists of a private and public key</returns> public (BigInteger privateKey, BigIntegerPoint publicKey) GenerateKeyPair() { BigInteger privateKey = EllipticCurveHelpers.RandomIntegerBelow(this.Curve.N); BigIntegerPoint publicKey = this.Curve.ScalarMult(privateKey, this.Curve.G); return(privateKey, publicKey); }
/// <summary> /// Generates signature. /// </summary> /// <param name="privateKey"></param> /// <param name="message"></param> /// <returns></returns> public (BigInteger r, BigInteger s) Sign(string message, BigInteger privateKey) { BigInteger z = this.HashMessage(message); BigInteger r = 0; BigInteger s = 0; while (r == 0 || s == 0) { BigInteger k = EllipticCurveHelpers.RandomIntegerBelow(this.Curve.N); BigIntegerPoint point = this.Curve.ScalarMult(k, this.Curve.G); r = EllipticCurveHelpers.MathMod(point.X, this.Curve.N); s = EllipticCurveHelpers.MathMod((z + r * privateKey) * this.Curve.InverseMod(k, this.Curve.N), this.Curve.N); } return(r, s); }