Generate Bitcoin Private Key Python
Aug 19, 2018 Python PyCrypto: Generate RSA Keys Example.py def generateRSA (bits = 2048): ' Generate an RSA keypair with an exponent of 65537 in PEM format. BUT IT DOESN'T WORK WITH THE PRIVATE KEY, JUST RETURNS 0B. This comment has been minimized. Mar 27, 2018 Generating a Bitcoin Private Key andAddress Filed under: bitcoin Davanum Srinivas @ 11:30 am Ken Shirriffs blog post here has an excellent introduction to Bitcoin. One of his code snippets shows a sample python code to generate a private key in WIF format and an address. Mar 03, 2019 What is a private key exactly? Private keys are based on secret 256-bit long string of letters and numbers which are randomly selected when you create a bitcoin wallet. This address enables you to send the bitcoins to a recipients destination address. Earning rate: 0.0000014 BTC/min Earned 0.002 BTC Per day! Affiliate bonus 30%. Jan 30, 2018 There is python Bitcoin library for this as well. Purpose of this post, is so you know how your keys are generated. (Rather than some long script or downloaded webpage) Again - the paranoid (wise) should never connect computer that generates keys to a network. After it's generated keys, in case of spyware.
In cryptocurrencies, a private key allows a user to gain access to their wallet. The person who holds the private key fully controls the coins in that wallet. For this reason, you should keep it secret. And if you really want to generate the key yourself, it makes sense to generate it in a secure way. Here, I will provide an introduction to private keys and show you how you can generate your.
Latest versionReleased:
Bitcoin and Other cryptocurrency Library
Project description
Python Bitcoin Library
Bitcoin, Litecoin and Dash Crypto Currency Library for Python.
Includes a fully functional wallet, with multi signature, multi currency and multiple accounts.You this library at a high level and create and manage wallets for the command line or at a low leveland create your own custom made transactions, keys or wallets.
The BitcoinLib connects to various service providers automatically to update wallets, transactions andblockchain information. It does currently not parse the blockchain itself.
Documentation
Read the full documentation at: http://bitcoinlib.readthedocs.io/
Disclaimer
This library is still in development, please use at your own risk and test sufficiently before using it in aproduction environment.
Some Examples
Wallet
The bitcoin library contains a wallet implementation using SQLAlchemy and SQLite3 to import, create and managekeys in a Hierarchical Deterministic way.
Example: Create wallet and generate new address (key) to receive bitcoins
Now send a small transaction to your wallet and use the scan() method to update transactions and UTXO’s
When your wallet received a payment and has unspent transaction outputs, you can send bitcoins easily.If successful a transaction ID is returned
Wallet from passphrase with accounts and multiple currencies
The following code creates a wallet with two bitcoin and one litecoin account from a Mnemonic passphrase.The complete wallet can be recovered from the passphrase which is the masterkey.
Multi Signature Wallets
Create a Multisig wallet with 2 cosigner which both need to sign a transaction.
Create a transaction in the first wallet
Hyundai sonata cdr download. And then import the transaction in the second wallet, sign it and push it to the network
Segregated Witness Wallet
Easily create and manage segwit wallets. Both native segwit with base32/bech32 addresses and P2SH nested segwitwallets with traditional addresses are available.
Create a native single key P2WPKH wallet:
Or create a P2SH nested single key P2SH_P2WPKH wallet:
Command Line Tool
With the command line tool you can create and manage wallet without any Python programming.
To create a new Bitcoin wallet
You can use clw to create simple or multisig wallets for various networks, manage public and private keysand managing transactions.
For the full command line wallet documentation please read
Mnemonic key generation
Allows you to use easy to remember passphrases consisting of a number of words to store private keys (BIP0039).You can password protect this passphrase (BIP0038), and use the HD Wallet structure to generate a almost infinitenumber of new private keys and bitcoin addresses (BIP0043 and BIP0044).
Example: Generate a list of words passphrase and derive a private key seed

Service providers
Communicates with pools of bitcoin service providers to retreive transaction, address, blockchain information.Can be used to push a transaction to the network, determine optimal service fee for a transaction or to update yourwallet’s balance. /generate-public-key-from-private-key-openssl.html.
When working with wallets connections to service providers are automatically managed so you don’t have to worryabout them. You can however easily use the Service object directly.
Example: Get estimated transaction fee in sathosis per Kb for confirmation within 5 blocks
Other Databases
Bitcoinlib uses the SQLite database by default but other databases are supported as well.See http://bitcoinlib.readthedocs.io/en/latest/_static/manuals.databases.html for instructions on how to useMySQL or PostgreSQL.
More examples
For more examples see https://github.com/1200wd/bitcoinlib/tree/master/examples
Implements the following Bitcoin Improvement Proposals
- Hierarchical Deterministic Wallets (BIP0032)
- Passphrase-protected private key (BIP0038)
- Mnemonic code for generating deterministic keys (BIP0039)
- Purpose Field for Deterministic Wallets (BIP0043)
- Multi-Account Hierarchy for Deterministic Wallets (BIP0044)
- Structure for Deterministic P2SH Multisignature Wallets (BIP0045)
- Bech32/base32 address format for native v0-16 witness outputs (BIP0173)
- Native and P2SH nested Segregated Witness transactions (BIP0141 and BIP0143)
Installing and updating
Pre-requirements Linux
sudo apt install build-essentialpython-devpython3-devlibgmp3-dev
To install OpenSSL development package on Debian, Ubuntu or their derivatives
sudo apt install libssl-dev
To install OpenSSL development package on Fedora, CentOS or RHEL
sudo yum install gcc openssl-devel
Pre-requirements Windows
This library requires a Microsoft Visual C++ Compiler. Seehttp://bitcoinlib.readthedocs.io/en/latest/_static/manuals.install.html
The fastecdsa library is not enabled at this moment on windows, the slower ecdsa library is installed.
Install with pip
pip install bitcoinlib
These packages will be installed* fastecdsa (or ecdsa on Windows)* pyaes* scrypt* sqlalchemy* requests* enum34 (for older Python installations)* pathlib2 (for Python 2)* six
Install development environment
Required packages:
sudo apt install -y postgresql postgresql-contribmysql-serverlibpq-devlibmysqlclient-dev
Create a virtual environment for instance on linux with virtualenv:
Then clone the repository and install dependencies:
Troubleshooting
When you experience issues with the scrypt package when installing you can try to solve this by removing and reinstallscrypt:
Please make sure you also have the Python development and SSL development packages installed, see ‘Other requirements’above.
You can also use pyscrypt instead of scrypt. Pyscrypt is a pure Python scrypt password-based key derivation library.It works but it is slow when using BIP38 password protected keys.
If you run into issues to not hesitate to contact us or file an issue at https://github.com/1200wd/bitcoinlib/issues
Update library
Update to the latest version of the library with
To upgrade make sure everything is backuped and run updatedb.py from the installation directory.
For more information on installing, updating and maintenance seehttps://bitcoinlib.readthedocs.io/en/latest/_static/manuals.install.html#installation
Future / Roadmap
- Create Script class and support advanced scripts
- Fully support timelocks
- Support for Trezor wallet
- Improve speed and security
- Integrate in ERP and shopping solutions such as Odoo, Magento, Shopware
- Support for lightning network
Release historyRelease notifications
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.37
0.3.36
0.3.36a0 pre-release
0.3.35.post1
0.3.34
0.3.34a2 pre-release
0.3.34a1 pre-release
0.3.33a4 pre-release
0.3.33a3 pre-release
0.3.33a2 pre-release
0.3.33a1 pre-release
0.3.33a0 pre-release
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
| Filename, size | File type | Python version | Upload date | Hashes |
|---|---|---|---|---|
| Filename, size bitcoinlib-0.4.14.tar.gz (418.1 kB) | File type Source | Python version None | Upload date | Hashes |
Hashes for bitcoinlib-0.4.14.tar.gz
| Algorithm | Hash digest |
|---|---|
| SHA256 | 2bd336c7436b8d1875abcfce0a700e27b06f48c9b50b622adc8f97d7c65a5614 |
| MD5 | 9744035220173e6504ddd75a3de50a77 |
| BLAKE2-256 | d55d82ee2839784b79a8bbb9448298885ac36d2c865eae135ebd78ae70ca228f |
In cryptocurrencies, a private key allows a user to gain access to their wallet. The person who holds the private key fully controls the coins in that wallet. For this reason, you should keep it secret. And if you really want to generate the key yourself, it makes sense to generate it in a secure way.
Here, I will provide an introduction to private keys and show you how you can generate your own key using various cryptographic functions. I will provide a description of the algorithm and the code in Python.
Do I need to generate a private key?
Most of the time you don’t. For example, if you use a web wallet like Coinbase or Blockchain.info, they create and manage the private key for you. It’s the same for exchanges.
Mobile and desktop wallets usually also generate a private key for you, although they might have the option to create a wallet from your own private key.
So why generate it anyway? Here are the reasons that I have:
- You want to make sure that no one knows the key
- You just want to learn more about cryptography and random number generation (RNG)
What exactly is a private key?
Formally, a private key for Bitcoin (and many other cryptocurrencies) is a series of 32 bytes. Now, there are many ways to record these bytes. It can be a string of 256 ones and zeros (32 * 8 = 256) or 100 dice rolls. It can be a binary string, Base64 string, a WIF key, mnemonic phrase, or finally, a hex string. For our purposes, we will use a 64 character long hex string.
Why exactly 32 bytes? Great question! You see, to create a public key from a private one, Bitcoin uses the ECDSA, or Elliptic Curve Digital Signature Algorithm. More specifically, it uses one particular curve called secp256k1.
Now, this curve has an order of 256 bits, takes 256 bits as input, and outputs 256-bit integers. And 256 bits is exactly 32 bytes. So, to put it another way, we need 32 bytes of data to feed to this curve algorithm.
There is an additional requirement for the private key. Because we use ECDSA, the key should be positive and should be less than the order of the curve. The order of secp256k1 is FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141, which is pretty big: almost any 32-byte number will be smaller than it.
Naive method
So, how do we generate a 32-byte integer? The first thing that comes to mind is to just use an RNG library in your language of choice. Python even provides a cute way of generating just enough bits:
Looks good, but actually, it’s not. You see, normal RNG libraries are not intended for cryptography, as they are not very secure. They generate numbers based on a seed, and by default, the seed is the current time. That way, if you know approximately when I generated the bits above, all you need to do is brute-force a few variants.
When you generate a private key, you want to be extremely secure. Remember, if anyone learns the private key, they can easily steal all the coins from the corresponding wallet, and you have no chance of ever getting them back.
So let’s try to do it more securely.
Cryptographically strong RNG
Along with a standard RNG method, programming languages usually provide a RNG specifically designed for cryptographic operations. This method is usually much more secure, because it draws entropy straight from the operating system. The result of such RNG is much harder to reproduce. You can’t do it by knowing the time of generation or having the seed, because there is no seed. Well, at least the user doesn’t enter a seed — rather, it’s created by the program.
In Python, cryptographically strong RNG is implemented in the secrets module. Let’s modify the code above to make the private key generation secure!
That is amazing. I bet you wouldn’t be able to reproduce this, even with access to my PC. But can we go deeper?
Specialized sites
There are sites that generate random numbers for you. We will consider just two here. One is random.org, a well-known general purpose random number generator. Another one is bitaddress.org, which is designed specifically for Bitcoin private key generation.
Can random.org help us generate a key? Definitely, as they have service for generating random bytes. But two problems arise here. Random.org claims to be a truly random generator, but can you trust it? Can you be sure that it is indeed random? Can you be sure that the owner doesn’t record all generation results, especially ones that look like private keys? The answer is up to you. Oh, and you can’t run it locally, which is an additional problem. This method is not 100% secure.
Now, bitaddress.org is a whole different story. It’s open source, so you can see what’s under its hood. It’s client-side, so you can download it and run it locally, even without an Internet connection.
So how does it work? It uses you — yes, you — as a source of entropy. It asks you to move your mouse or press random keys. You do it long enough to make it infeasible to reproduce the results.
Are you interested to see how bitaddress.org works? For educational purposes, we will look at its code and try to reproduce it in Python.
Quick note: bitaddress.org gives you the private key in a compressed WIF format, which is close to the WIF format that we discussed before. For our purposes, we will make the algorithm return a hex string so that we can use it later for a public key generation.
Bitaddress: the specifics
Bitcoin Private Key Generator
Bitaddress creates the entropy in two forms: by mouse movement and by key pressure. We’ll talk about both, but we’ll focus on the key presses, as it’s hard to implement mouse tracking in the Python lib. We’ll expect the end user to type buttons until we have enough entropy, and then we’ll generate a key.
Bitaddress does three things. It initializes byte array, trying to get as much entropy as possible from your computer, it fills the array with the user input, and then it generates a private key.
Bitaddress uses the 256-byte array to store entropy. This array is rewritten in cycles, so when the array is filled for the first time, the pointer goes to zero, and the process of filling starts again.
The program initiates an array with 256 bytes from window.crypto. Then, it writes a timestamp to get an additional 4 bytes of entropy. Finally, it gets such data as the size of the screen, your time zone, information about browser plugins, your locale, and more. That gives it another 6 bytes.
After the initialization, the program continually waits for user input to rewrite initial bytes. When the user moves the cursor, the program writes the position of the cursor. When the user presses buttons, the program writes the char code of the button pressed.
Finally, bitaddress uses accumulated entropy to generate a private key. It needs to generate 32 bytes. For this task, bitaddress uses an RNG algorithm called ARC4. The program initializes ARC4 with the current time and collected entropy, then gets bytes one by one 32 times.
This is all an oversimplification of how the program works, but I hope that you get the idea. You can check out the algorithm in full detail on Github.
Doing it yourself
For our purposes, we’ll build a simpler version of bitaddress. First, we won’t collect data about the user’s machine and location. Second, we will input entropy only via text, as it’s quite challenging to continually receive mouse position with a Python script (check PyAutoGUI if you want to do that).
That brings us to the formal specification of our generator library. First, it will initialize a byte array with cryptographic RNG, then it will fill the timestamp, and finally it will fill the user-created string. After the seed pool is filled, the library will let the developer create a key. Actually, they will be able to create as many private keys as they want, all secured by the collected entropy.
Initializing the pool
Here we put some bytes from cryptographic RNG and a timestamp. __seed_int and __seed_byte are two helper methods that insert the entropy into our pool array. Notice that we use secrets.
Generate Bitcoin Private Key Python Server
Seeding with input
Here we first put a timestamp and then the input string, character by character.
Generating the private key
This part might look hard, but it’s actually very simple.
First, we need to generate 32-byte number using our pool. Unfortunately, we can’t just create our own random object and use it only for the key generation. Instead, there is a shared object that is used by any code that is running in one script.
What does that mean for us? It means that at each moment, anywhere in the code, one simple random.seed(0) can destroy all our collected entropy. We don’t want that. Thankfully, Python provides getstate and setstate methods. So, to save our entropy each time we generate a key, we remember the state we stopped at and set it next time we want to make a key.
Second, we just make sure that our key is in range (1, CURVE_ORDER). This is a requirement for all ECDSA private keys. The CURVE_ORDER is the order of the secp256k1 curve, which is FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141.
Finally, for convenience, we convert to hex, and strip the ‘0x’ part.
In action
Let’s try to use the library. Actually, it’s really simple: you can generate a private key in three lines of code!
You can see it yourself. The key is random and totally valid. Moreover, each time you run this code, you get different results.
Conclusion
As you can see, there are a lot of ways to generate private keys. They differ in simplicity and security.
Generating a private key is only a first step. The next step is extracting a public key and a wallet address that you can use to receive payments. The process of generating a wallet differs for Bitcoin and Ethereum, and I plan to write two more articles on that topic.

If you want to play with the code, I published it to this Github repository.
I am making a course on cryptocurrencies here on freeCodeCamp News. The first part is a detailed description of the blockchain.
I also post random thoughts about crypto on Twitter, so you might want to check it out.