In the previous article, we looked at different methods to generate a private key. Whatever method you choose, you’ll end up with 32 bytes of data. Here’s the one that we got at the end of that article:
Bitcoin Auto Mode Options We created some simple auto modes that will allow you to browse the Bitcoin Key pages automatically. Bitcoin Random Formula generates a random set of keys based off our secret formula.; Bitcoin Random Page generates a set of keys based of the page number.; Bitcoin Page Ascending runs in ascending order from this page to the last page. There are random generated Bitcoin private keys, converted into WIF format and hashed to addresses. After getting Bitcoin address we check the quantity of transactions (Tx) and get its balance. If you see any address with transactions, we will store this address into leak database and will try to notify the owner. Because this address was used previously, it may be active now. Nobody is supposed to get these Bitcoins.
Bitcoin private keys are most commonly displayed in wallet import format (WIF), also known as base58check (a number expressed in base 58 with a checksum at the end and a version byte at the beginning). To create a WIF private key, you need to: Generate an ECDSA secret exponent (the private key) using the SECP256k1 curve. We help you generate bitcoin private key for non spendable funds. Online bitcoin private key generator private key finder and fake transaction tools. Bitcoin private key We provide services for blockchain private key recovery, methods to spend non spendable funds and other hacking tips and tricks such as how to generate fake bitcoin transactions. 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.
60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2
We’ll use this private key throughout the article to derive both a public key and the address for the Bitcoin wallet.
What we want to do is to apply a series of conversions to the private key to get a public key and then a wallet address. Most of these conversions are called hash functions. These hash functions are one-way conversions that can’t be reversed. We won’t go to the mechanics of the functions themselves — there are plenty of great articles that cover that. Instead, we will look at how using these functions in the correct order can lead you to the Bitcoin wallet address that you can use.
The first thing we need to do is to apply the ECDSA or Elliptic Curve Digital Signature Algorithm to our private key. An elliptic curve is a curve defined by the equation y² = x³ + ax + b
with a chosen a
and b
. There is a whole family of such curves that are widely known and used. Bitcoin uses the secp256k1 curve. If you want to learn more about Elliptic Curve Cryptography, I’ll refer you to this article.
By applying the ECDSA to the private key, we get a 64-byte integer. This consists of two 32-byte integers that represent the X and Y of the point on the elliptic curve, concatenated together.
For our example, we got: 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7
.
In Python, it would look like this:
Note: as you can see from the code, before I used a method from the ecdsa
module, I decoded the private key using codecs
. This is relevant more to the Python and less to the algorithm itself, but I will explain what are we doing here to remove possible confusion.
In Python, there are at least two classes that can keep the private and public keys: “str” and “bytes”. The first is a string and the second is a byte array. Cryptographic methods in Python work with a “bytes” class, taking it as input and returning it as the result.
Now, there’s a little catch: a string, say, 4f3c
does not equal the byte array 4f3c
, it equals the byte array with two elements, O&
lt;. And that’s what codecs.dec
ode method does: it converts a string into a byte array. That will be the same for all cryptographic manipulations that we’ll do in this article.
Once we’re done with the ECDSA, all we need to do is to add the bytes 0x04
at the start of our public key. The result is a Bitcoin full public key, which is equal to: 041e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7
for us.
But we can do better. As you might remember, the public key is some point (X, Y) on the curve. We know the curve, and for each X there are only two Ys that define the point which lies on that curve. So why keep Y? Instead, let’s keep X and the sign of Y. Later, we can derive Y from that if needed.
The specifics are as follows: we take X from the ECDSA public key. Now, we add the 0x02
if the last byte of Y is even, and the byte 0x03
if the last byte is odd.
Generate private key with public key system. The name can include up to 255 ASCII characters. It can’t include leading or trailingspaces.Either choose Browse to navigate to and select your public key,or paste the contents of your public key into the Public key contentsfield.Choose Import key pair.Verify that the key pair you imported appears in the list of key pairs.Old console. It can’tinclude leading or trailing spaces.Verify that the key pair you imported appears in the list of key pairs.AWS CLITo import the public keyUse the AWS CLI command.To verify that the key pair was imported successfullyUse theAWS CLI command.PowerShellTo import the public keyUse theAWS Tools for Windows PowerShell command.To verify that the key pair was imported successfullyUse theAWS Tools for Windows PowerShell command.Tagging a Key PairTo help categorize and manage your existing key pairs, you can tagthem with custom metadata. To import the public key.Open the Amazon EC2 console at.In the navigation pane, under NETWORK & SECURITY, chooseKey Pairs.Choose Import Key Pair.In the Import Key Pair dialog box, chooseBrowse, and select the public key file that you saved previously.Enter a name for the key pair in the Key pair name field, and chooseImport.
In our case, the last byte is odd, so we add 0x03
to get the compressed public key: 031e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7
. This key contains the same information, but it’s almost twice as short as the uncompressed key. Cool!
Previously, wallet software used long, full versions of public keys, but now most of it has switched to compressed keys.
From now on, we need to make a wallet address. Whatever method of getting the public key you choose, it goes through the same procedure. Obviously, the addresses will differ. In this article, we will go with the compressed version.
What we need to do here is to apply SHA-256 to the public key, and then apply RIPEMD-160 to the result. The order is important.
SHA-256 and RIPEMD-160 are two hash functions, and again, we won’t go into the details of how they work. What matters is that now we have 160-bit integer, which will be used for further modifications. Let’s call that an encrypted public key. For our example, the encrypted public key is 453233600a96384bb8d73d400984117ac84d7e8b
.
Here’s how we encrypt the public key in Python:
The Bitcoin has two networks, main and test. The main network is the network that all people use to transfer the coins. The test network was created — you guessed it — to test new features and software.
We want to generate an address to use it on the mainnet, so we need to add 0x00
bytes to the encrypted public key. The result is 00453233600a96384bb8d73d400984117ac84d7e8b
. For the testnet, that would be 0x6f
bytes.
Now we need to calculate the checksum of our mainnet key. The idea of checksum is to make sure that the data (in our case, the key) wasn’t corrupted during transmission. The wallet software should look at the checksum and mark the address as invalid if the checksum mismatches.
To calculate the checksum of the key, we need to apply SHA-256 twice and then take first 4 bytes of the result. For our example, the double SHA-256 is 512f43c48517a75e58a7ec4c554ecd1a8f9603c891b46325006abf39c5c6b995
and therefore the checksum is 512f43c4
(note that 4 bytes is 8 hex digits).
The code to calculate an address checksum is the following:
Finally, to make an address, we just concatenate the mainnet key and the checksum. That makes it 00453233600a96384bb8d73d400984117ac84d7e8b512f43c4
for our example.
A length of less than 512 bits is normally not recommended. Generate ssh key cisco router. Router360 bits512 bits1024 bits2048 bits (maximum)Cisco 250011 seconds20 seconds4 minutes, 38 secondsMore than 1 hourCisco 4700Less than 1 second1 second4 seconds50 secondsCisco IOS software does not support a modulus greater than 4096 bits. Router(config)# crypto key generate rsa general-keys The name for the keys will be: myrouter.example.comChoose the size of the key modulus in the range of 360 to 2048 for your General Purpose Keys. In certain situations, the shorter modulus may not function properly with IKE, so we recommend using a minimum modulus of 2048 bits.
That’s it! That’s the wallet address for the private key at the start of the article.
But you may notice that something is off. You’ve probably seen a handful of Bitcoin addresses and they didn’t look like that. Well, the reason is that they are encoded with Base58. It’s a little bit odd.
Here’s the algorithm to convert a hex address to the Base58 address:
What we get is 17JsmEygbbEUEpvt4PFtYaTeSqfb9ki1F1
, a compressed Bitcoin wallet address.
The wallet key generation process can be split into four steps:
Depending on the form of public key (full or compressed), we get different addresses, but both are perfectly valid.
Here’s the full algorithm for the uncompressed public key:
If you want to play with the code, I published it to the 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.
Private Key (WIF) | Address | Compressed Address | Tx / Balance |
---|---|---|---|
5K6na4pW1SbJzvTCswYSai1u4HxNyevW3VTCLoSGfdrzf2pMyHq | 1Ch99UbxZQpYqTw7Mf8LX7Zng875qHsaZv | 1PwCTPkDT5jAbYX2VJSFqU7AuaL7hGonf1 | 0 / 0 |
5JS47TTR3Ad8SZSyWDGrm5TKxS3S8UuUBGNxeoSR4WfiEL5WSEt | 1ER2mWbn5vXtDTLf2dUhWt8AKn6bPLwtYh | 1DA66Ls1wvrc6u8MxNF3zTpAVvPfzZqRFR | 0 / 0 |
5Jh9tauwZvmqxvksFW5LznN6WDQozWH2mpXfLsJTvYgt6hbcwUg | 1Kcowg3AkPEPN9F2tJ8SEMwhfzijwJ7QWV | 14pD5wJPLbbAqz9itKjiNRUf6LvEYQKerk | 0 / 0 |
5JYpex5gAuedub9ufTm1LNk6dgaKkdVymdpSxyiYxFbwEp15viz | 1DG6LmGYZSAKg5WaEJoooQmqAS4tnLAwig | 1LWJfBXMMHGDaqdHantD8Yr5LbJm1UGZFe | 0 / 0 |
5JpaE4UwwwWz1cB67B8bm5HCFqpy4jQZx2m2Eav2qPDLSQwc5JH | 1EE8N4fHqK8TmkmDSQFgnKXRgNTFjkWSRu | 13J4aevo9uY9fzPMvd9ERhxZPgh7qCN1GP | 0 / 0 |
5JZG44BrbgTe4KKycNc83bSvgRQ3xR6ix65B1di8jYCkCvcBCyX | 14DPmw1YhjwSfh3poaWoReRGQFRdw4Vt9C | 1ETnwZwd7gpt3CLaXfhJC7gLELoAk8nzMj | 0 / 0 |
5KeLhn8e9CoX2PhznoibzMuCHqQy6BYxHW5sf25imAryWPnByRs | 1DW43dCXaGrUXvxUdTN17wMp7ysdyRT2J5 | 12BUEAfWTuaxsEH7Eoke46tDdgv2qrmGf2 | 0 / 0 |
5HrZdwZDas2WjgQZs1V1TgfXGi6YGWgXnWntbY7GWJYmBEobcc4 | 12ufrNwRi55EaS5cAPNUVRUSjY5ujcgy5a | 1JMSq8Aae6fMtzNXm4tKEuvb8C9YNFcJ84 | 0 / 0 |
5J3Q7u8MVmCYvcHHUKzAA5vK7HyWG4fG98mt2BBUz2738Zp2fAR | 1DfwTXAQZF66pwdzrRB22SnEMqdzHr9Cnn | 12ruwsnN3DLLu2PXkLGw7PyGDNAQ381zAe | 0 / 0 |
5Jwp6BNJsBu4gjJjhUX5ojGDRAgLREoYRjjrQobMkTcJ5PLKxSv | 1NWipF5Egugz9VPDdoFfiAxZ1ZNHsyHL5n | 12eBfux65F63NhscBYhCv6aVZ18yh5Dg3m | 0 / 0 |