Exemplo n.º 1
0
        public void TestEllipticCurve()
        {
            EllipticCurveAlgorithm curve = EllipticCurveAlgorithm.Create(EllipticCurveAlgorithm.EcDsaSha2Nistp256);
            var    privateKey            = curve.GetPrivateKey();
            var    publicKey             = curve.GetPublicKey();
            string privateKeyStr         = Convert.ToBase64String(privateKey);
            string publicKeyStr          = Convert.ToBase64String(publicKey);

            _testOutputHelper.WriteLine($"Private Key: {privateKeyStr} \n" +
                                        $"Public Key: {publicKeyStr}");
        }
Exemplo n.º 2
0
        public static KeyPair GenerateNewKeyPair()
        {
            //Key privateKey = new Key(); // NBitcoin: generate a random private key
            EllipticCurveAlgorithm curve = EllipticCurveAlgorithm.Create(EllipticCurveAlgorithm.EcDsaSha2Nistp256);

            byte [] pKey   = curve.GetPrivateKey();
            byte [] pubKey = curve.GetPublicKey();

            string PrivateKey = Convert.ToBase64String(pKey);
            string PublicKey  = Convert.ToBase64String(pubKey);

            return(new KeyPair()
            {
                PrivateKey = PrivateKey, PublicKey = PublicKey
            });
        }
Exemplo n.º 3
0
        public void ShouldSignAndVerifyDataHash()
        {
            EllipticCurveAlgorithm curve = EllipticCurveAlgorithm.Create(EllipticCurveAlgorithm.EcDsaSha2Nistp256);
            var privateKey = curve.GetPrivateKey();
            EllipticCurveDsa ellipticCurveDsa     = new EllipticCurveDsa("1.2.840.10045.3.1.7", EllipticCurveAlgorithm.EcDsaSha2Nistp256);
            EllipticCurveDsa ellipticCurveDsaFake = new EllipticCurveDsa("1.2.840.10045.3.1.7", EllipticCurveAlgorithm.EcDsaSha2Nistp256);

            ellipticCurveDsa.FromPrivateKey(privateKey);
            ellipticCurveDsaFake.FromPrivateKey(privateKey);

            SHA256 sHA256 = SHA256.Create();

            byte[] hashBytes = sHA256.ComputeHash(Encoding.Default.GetBytes("Message to be hashed"));

            byte[] signature = ellipticCurveDsa.SignHash(hashBytes);


            bool isCorrect = ellipticCurveDsa.VerifyHash(hashBytes, signature);

            bool isFake = ellipticCurveDsaFake.VerifyHash(hashBytes, signature);

            Assert.Equal(isCorrect, isFake);
        }
Exemplo n.º 4
0
        public void ShouldVerifyTransactionUsingPublicKey()
        {
            EllipticCurveAlgorithm curve = EllipticCurveAlgorithm.Create(EllipticCurveAlgorithm.EcDsaSha2Nistp256);
            var privateKey = curve.GetPrivateKey();
            var pubKey     = curve.GetPublicKey();
            //The first curve is created from the private key
            EllipticCurveDsa ellipticCurveDsa = new EllipticCurveDsa("1.2.840.10045.3.1.7", EllipticCurveAlgorithm.EcDsaSha2Nistp256);

            ellipticCurveDsa.FromPrivateKey(privateKey);
            //The second curve is created from the public key of the first curve and is used to verify the transaction
            //The public key can be easily shared which makes it easy for verification
            EllipticCurveDsa ellipticCurveDsaFake = new EllipticCurveDsa("1.2.840.10045.3.1.7", EllipticCurveAlgorithm.EcDsaSha2Nistp256);

            ellipticCurveDsaFake.FromPublicKey(pubKey);

            SHA256 sHA256 = SHA256.Create();

            byte[] hashBytes = sHA256.ComputeHash(Encoding.Default.GetBytes("Message to be hashed"));

            byte[] signature = ellipticCurveDsa.SignHash(hashBytes);


            bool isCorrect = ellipticCurveDsa.VerifyHash(hashBytes, signature);

            bool isFake = ellipticCurveDsaFake.VerifyHash(hashBytes, signature);

            Assert.Equal(isCorrect, isFake);

            //Perform same operation using ChainUtility
            byte[] signature2 = ChainUtility.SignDataHash(hashBytes, Convert.ToBase64String(privateKey));

            var newKeyPair = ChainUtility.GenerateNewKeyPair();

            Assert.True(ChainUtility.VerifySignature(pubKey, signature2, hashBytes));
            Assert.False(ChainUtility.VerifySignature(Convert.FromBase64String(newKeyPair.PublicKey), signature2, hashBytes));
        }
Exemplo n.º 5
0
        public void ShouldSignAndVerifyMessage()
        {
            EllipticCurveAlgorithm curve = EllipticCurveAlgorithm.Create(EllipticCurveAlgorithm.EcDsaSha2Nistp256);
            var privateKey = curve.GetPrivateKey();
            EllipticCurveDsa ellipticCurveDsa = new EllipticCurveDsa("1.2.840.10045.3.1.7", EllipticCurveAlgorithm.EcDsaSha2Nistp256);

            ellipticCurveDsa.FromPrivateKey(privateKey);
            EllipticCurveDsa ellipticCurveDsaFake = new EllipticCurveDsa("1.2.840.10045.3.1.7", EllipticCurveAlgorithm.EcDsaSha2Nistp256);

            ellipticCurveDsaFake.FromPrivateKey(privateKey);

            byte[] message = new BigInteger("968236873715988614170569073515315707566766479517").ToByteArray();

            byte[] signature = ellipticCurveDsa.SignMessage(message);


            bool isCorrect = ellipticCurveDsa.VerifyMessage(message, signature);

            bool isFake = ellipticCurveDsaFake.VerifyMessage(message, signature);

            Assert.Equal(isCorrect, isFake);

            //Both values are true because the curves were built from the same private key
        }