Пример #1
0
        /// <summary>
        /// Decrypt and retrieve the BitcoinSecret stored in the database.
        /// /// </summary>
        /// <param name="password">The password with which to decrypt the key.</param>
        /// <returns>The stored BitcoinSecret if exists or null if does not. Throws SecurityException on invalid password.</returns>
        public BitcoinSecret RetrieveDecryptedPrivateKey(string password)
        {
            var retrKeyDoc = BitCollection.FindOne(z => z.ContainsKey("BPK1"));

            if (retrKeyDoc != null)
            {
                return(BitcoinEncryptedSecret.Create(retrKeyDoc["BPK1"], Network.GetNetwork(retrKeyDoc["BPK1NW"])).GetSecret(password));
            }
            else
            {
                return(null);
            }
        }
Пример #2
0
        private ExtKey GetMasterKey()
        {
            if (String.IsNullOrEmpty(WalletExtendedPublicKey))
            {
                return(ExtKey.Parse(WalletPrivateKey));
            }

            var xpub     = ExtPubKey.Parse(WalletExtendedPublicKey);
            var password = default(SecureString);

            try
            {
                var encrypted = BitcoinEncryptedSecret.Create(WalletPrivateKey);
                password = GetPassword();

                return(new ExtKey(xpub, encrypted.GetKey(new NetworkCredential(String.Empty, password).Password)));
            }
            catch (FormatException)
            {
                return(new ExtKey(xpub, Key.Parse(WalletPrivateKey)));
            }
            catch (SecurityException)
            {
                Console.WriteLine("Invalid password.");
#if DEBUG
                Console.WriteLine("Press Any Key To Exit...");
                Console.Read();
#endif
                Environment.Exit(1);
                return(null);
            }
            finally
            {
                password?.Dispose();
            }
        }
Пример #3
0
        public void TestAddressCreation()
        {
            Key privateKey;                                                                               // = new Key();

            privateKey = Key.Parse("L5e7GTVzDEFTS2YwRJcRse5LkgpAetKApCafc6avoKLovPcnFE74", Network.Main); // For getting the same outputs
            PubKey         publicKey         = privateKey.PubKey;
            BitcoinAddress addressLegacy     = publicKey.GetAddress(ScriptPubKeyType.Legacy, Network.Main);
            BitcoinAddress addressSegwit     = publicKey.GetAddress(ScriptPubKeyType.Segwit, Network.Main);
            BitcoinAddress addressSegwitP2SH = publicKey.GetAddress(ScriptPubKeyType.SegwitP2SH, Network.Main);
            KeyId          publicKeyHash     = publicKey.Hash;

            // Wif -> 
            // Priv. key -> Wif (Check README.md - Wif)
            BitcoinSecret wif  = privateKey.GetWif(Network.Main);
            BitcoinSecret wif2 = new BitcoinSecret("L5e7GTVzDEFTS2YwRJcRse5LkgpAetKApCafc6avoKLovPcnFE74", Network.Main);

            Assert.AreEqual(wif, wif2);

            // Private key -> 
            // Wif -> Priv. key
            Key privateKey1 = Key.Parse("L5e7GTVzDEFTS2YwRJcRse5LkgpAetKApCafc6avoKLovPcnFE74", Network.Main);

            Assert.AreEqual(privateKey, privateKey1);

            // Base58 encoded priv key
            var privKeyVersionBytes = Network.Main.GetVersionBytes(Base58Type.SECRET_KEY, true);

            byte[] privKeyWithVersionBytes = Helper.Concat(privKeyVersionBytes, privateKey.ToBytes());
            var    privKeyBase58           = Encoders.Base58Check.EncodeData(privKeyWithVersionBytes);

            // Encrypted priv key (BIP38)
            BitcoinEncryptedSecret encryptedPrivKey = wif.Encrypt("password");

            // Decrypted priv key
            BitcoinEncryptedSecret encryptedPrivKeyFromStr = BitcoinEncryptedSecret.Create("6PYWRpL1zPnz5kVxn74H9WdGJZVQ3ah6Pnq54GNinkfrXdd9fWNVS6dn95", Network.Main);
            BitcoinSecret          decryptedPrivKey        = encryptedPrivKeyFromStr.GetSecret("password");

            Assert.AreEqual(wif, decryptedPrivKey);

            // Public key hash -> 
            // Check README (Hash160(Public Key))
            var hash1 = NBitcoin.Crypto.Hashes.SHA256(publicKey.ToBytes());
            var pkh   = NBitcoin.Crypto.Hashes.RIPEMD160(hash1, hash1.Length); // SHA256(RIPEMD160(PUB_KUY))
            var generatedPubKeyHash = new KeyId(pkh);

            Assert.AreEqual(publicKeyHash, generatedPubKeyHash);

            // Bitcoin Address > 
            var versionBytes = Network.Main.GetVersionBytes(Base58Type.PUBKEY_ADDRESS, true); // 0x00

            byte[] PKHWithVersionBytes = Helper.Concat(versionBytes, pkh);                    // 0x00 + PKH
            var    address1            = Encoders.Base58Check.EncodeData(PKHWithVersionBytes);

            Assert.AreEqual(addressLegacy.ToString(), address1); // 1Co3ZZ3U5ELVmZrV3oXk2qbv58AjuwRrnB

            Console.WriteLine();
            Console.WriteLine($"Pri : {privateKey.ToHex()} (Hex)");         // fb401b5261327d8543382c065af27e28a9775c278b7c3dba8cd0d88f0ad042b1
            Console.WriteLine($"Pri : {privKeyBase58} (Base58)");           // 5KiwSFcZuAM3N5Ruf8cfiNzdCFupxFoFuqPafmK7JHqtsEms7HB
            Console.WriteLine($"Pri : {encryptedPrivKey} (Encrypted)");     // 6PYWRpL1zPnz5kVxn74H9WdGJZVQ3ah6Pnq54GNinkfrXdd9fWNVS6dn95
            Console.WriteLine($"Pri : {wif} (Wif)");                        // L5e7GTVzDEFTS2YwRJcRse5LkgpAetKApCafc6avoKLovPcnFE74
            Console.WriteLine($"Pub : {publicKey}");                        // 03c092d451383dedd6052de6778f9b7c393252ecbd4cd05e842638a84a2c6e2528
            Console.WriteLine($"Pub : {publicKey.Decompress()} (Decomp.)"); // 04c092d451383dedd6052de6778f9b7c393252ecbd4cd05e842638a84a2c6e2528fe41f265a1d8884eb304a33b6f8a6a245fab83f7bf503d7dfc532ffc6593df15
            Console.WriteLine($"PKH : {publicKey.Hash}");                   // 815ea7e8372ae215c40dc3d07a024adc7ddaf858
            Console.WriteLine($"Add : {addressLegacy} (Legacy)");           // 1Co3ZZ3U5ELVmZrV3oXk2qbv58AjuwRrnB
            Console.WriteLine($"Add : {addressSegwitP2SH} (SegwitP2SH)");   // 3JCvRhjrEyw9pvZiE3TxsdSHNPJQh1vHTe
            Console.WriteLine($"Add : {addressSegwit} (Segwit)");           // bc1qs90206ph9t3pt3qdc0g85qj2m37a47zclpwws7
        }
Пример #4
0
 public bool PreRun()
 {
     _Check = BitcoinEncryptedSecret.Create(Address, Network.Main);
     return(true);
 }
Пример #5
0
        static void Main(string[] args)
        {
            var options = new Options();

            if (args.Length == 0)
            {
                ShowUsage(options);
            }
            if (Parser.Default.ParseArguments(args, options))
            {
                var network = options.Network.Equals("mainnet", StringComparison.InvariantCultureIgnoreCase)
                                        ? Network.Main :
                              options.Network.Equals("testnet", StringComparison.InvariantCultureIgnoreCase)
                              ? Network.TestNet : null;

                if (network == null)
                {
                    ShowUsage(options);
                    return;
                }
                if (options.GenerateKey)
                {
                    var key = new Key().GetBitcoinSecret(network);
                    Console.WriteLine("Private Key : " + key);
                    Console.WriteLine("Bitcoin Address : " + key.GetAddress());
                }

                if (options.GenerateEncryptedKey)
                {
                    Console.WriteLine("Password ? (input hidden from screen)");
                    var password = SecretReadLine();
                    while (true)
                    {
                        Console.WriteLine("Confirm, type the password again");
                        if (password == SecretReadLine())
                        {
                            break;
                        }
                        Console.WriteLine("You typed a different one");
                    }
                    var key = new Key().GetBitcoinSecret(network);
                    Console.WriteLine("Encrypted Key : " + key.Encrypt(password));
                    Console.WriteLine("Bitcoin Address : " + key.GetAddress());
                }

                if (options.DecryptEncryptedKey)
                {
                    Console.WriteLine("Encrypted Key ?");
                    BitcoinEncryptedSecret key = null;
                    while (true)
                    {
                        var encrypted = Console.ReadLine();
                        try
                        {
                            key = BitcoinEncryptedSecret.Create(encrypted);
                            break;
                        }
                        catch (FormatException)
                        {
                            Console.WriteLine("Wrong format");
                        }
                    }
                    Console.WriteLine("Password ? (input hidden from screen)");
                    BitcoinSecret secret = null;
                    while (true)
                    {
                        try
                        {
                            var password = SecretReadLine();
                            secret = key.GetSecret(password);
                            Console.WriteLine("Decrypted successfully");
                            Console.WriteLine("Bitcoin address : " + secret.GetAddress());
                            break;
                        }
                        catch (SecurityException ex)
                        {
                            Console.WriteLine("Wrong password");
                        }
                    }

                    Console.WriteLine("Print the decrypted key on screen ? (o/n)");
                    var r = Console.ReadLine();
                    if (r.Equals("o", StringComparison.InvariantCultureIgnoreCase))
                    {
                        Console.WriteLine(secret);
                    }
                }

                if (!String.IsNullOrEmpty(options.ParseBase58))
                {
                    try
                    {
                        var result = Network.CreateFromBase58Data(options.ParseBase58, network);
                        Console.WriteLine(result.GetType().Name);
                        if (result is BitcoinSecret)
                        {
                            Console.WriteLine("Bitcoin Address " + ((BitcoinSecret)result).GetAddress());
                        }
                    }
                    catch (FormatException)
                    {
                        Console.Write("Invalid base58");
                    }
                }
            }
        }