Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }