17

How can I take the output of sha256sum

sudofox@ubuntu:~$ echo -n 'Hi guys!' | sha256sum
7542fb6685f9fd8f37d56faf62f0bb4563684a51539e4b26f0840db361e0027c  -

and turn it into a Base58Check encoded private key?

I need to be able to do this with a list of SHA256 keys. Is there a script I can download, or must I spend a few weeks making it just so I can make my temporary addresses?

In response to first comment: No, I must input a string, like "fluttershy", for example, into sha256sum and then I must encode the output of sha256sum into a base58check private key.

string -->sha256sum --> some automagic process, which is the purpose of this question --> bitcoin private key.

Update: For anyone wanting to use Grondilu's Bitcoin Bash Tools: You need to source the bitcoin.sh file after extracting it into your directory to use the functions.

source ./bitcoin.sh

Update 2 (Aug 2017): Rewrote script to go from step 1 to WIF in one go. You can just add the declaration of base58 and the encodeBase58 functions from bitcoin.sh if you want to skip the rest of the lib.

#!/bin/bash
#Tool to convert bitcoin privkeys into WIF keys
# by sudofox

source ./bitcoin.sh

KEY=$1 # first arg

# add 0x80 to beginning
EXTENDEDKEY=$(echo 80$KEY)
FIRSTHASH=$(echo -n "$EXTENDEDKEY" |xxd -r -p |sha256sum -b|awk '{print $1}')
SECONDHASH=$(echo -n "$FIRSTHASH" |xxd -r -p |sha256sum -b|awk '{print $1}')
CHECKSUM=$(echo $SECONDHASH|cut -c1-8)
FINAL=$(encodeBase58 $EXTENDEDKEY$CHECKSUM)
echo $FINAL

The usage would be

./sha256_to_privkey.sh key

where in my example (see Stephen Gornick's answer), key would be

807542FB6685F9FD8F37D56FAF62F0BB4563684A51539E4B26F0840DB361E0027CCD5C4A8E

Do the same thing for the various functions, modifying as needed. Hope this helps anyone struggling to use the tools.

4
  • Yes, this is possible. But I have a strong feeling this is an XY problem
    – Nick ODell
    Commented Mar 9, 2013 at 3:36
  • Clarification (well, stating in explicit terms) above. Commented Mar 9, 2013 at 3:50
  • Is there some reason why you want to send your bitcoins to an unspendable public key?
    – Nick ODell
    Commented Mar 9, 2013 at 4:08
  • @Nick ODell "Unspendable public key?" I'm generating a bitcoin private key. That means it would be spendable as long as I still have the key I generated. You changed the title of my question so that it looks like I want to hash the private key and then try to turn that into a bitcoin address. Why would I want to do that? I'm changing the title to "How can I convert a SHA256 hash into a Bitcoin base58 private key?" Commented Mar 9, 2013 at 5:04

1 Answer 1

19

What you are requesting is described as computing the Wallet Import Format for that private key:

Using your example:

1.) Take a private key (Below is the HEX representation of binary value)

7542FB6685F9FD8F37D56FAF62F0BB4563684A51539E4B26F0840DB361E0027C

2.) Add a 0x80 byte in front of it

807542FB6685F9FD8F37D56FAF62F0BB4563684A51539E4B26F0840DB361E0027C

3.) Perform SHA-256 hash on the extended key

$ echo -n '807542FB6685F9FD8F37D56FAF62F0BB4563684A51539E4B26F0840DB361E0027C' | xxd -r -p | sha256sum -b

7DE4708EB23AB611371BB778FC0C8BDE80394AB2D8704D7129FB5771E2F1730D

4.) Perform SHA-256 hash on result of SHA-256 hash

$ echo -n '7DE4708EB23AB611371BB778FC0C8BDE80394AB2D8704D7129FB5771E2F1730D' | xxd -r -p | sha256sum -b

CD5C4A8E03DFBB0E3AA021C2D74A9EAA43CE4C9CB1B20FC88729A7A5834141CA

5.) Take the first 4 bytes of the second SHA-256 hash, this is the checksum

CD5C4A8E

6.) Add the 4 checksum bytes from point 5 at the end of the extended key from point 2

807542FB6685F9FD8F37D56FAF62F0BB4563684A51539E4B26F0840DB361E0027CCD5C4A8E

7.) Convert the result from a byte string into Base58 to get it into the Base58Check format. This is also known as the Wallet Import Format

(Converted from point 6 to base58 using https://bitcointools.appspot.com, or using encodeBase58 from https://github.com/grondilu/bitcoin-bash-tools)

5JhvsapkHeHjy2FiUQYwXh1d74evuMd3rGcKGnifCdFR5G8e6nH

6
  • A handy utility that does each step: gobittest.appspot.com/PrivateKey Commented Mar 9, 2013 at 5:10
  • This looks pretty good! I'll give it a shot Sunday (we're going 'cross state to see frozen waves tomorrow). Expect an 'accepted' soon! Oh, and very useful links. Commented Mar 9, 2013 at 5:18
  • Thank you very much. Everything's working really well now. For future reference to anyone wanting to use Grondilu's Bitcoin Bash Tools: Source bitcoin.sh after extracting it into your directory. Commented Mar 11, 2013 at 1:04
  • 1
    The wording of step 7 is a little misleading. You've already added the checksum in step 6, so in step 7 you should convert the hex to Base58, not Base58Check. Brainwallet.org has a converter. You can download the brainwallet source code from github and run it offline. Commented Nov 10, 2014 at 0:21
  • on Step 7 Convert the hex string back into bytecode before running it through base58...that step isn't very clear...Also I found that I had to decode my hex values back into bytecode for the sha digests but to then encode them back into hex so they were readable to my console (using python) Commented Mar 20, 2016 at 11:02

Not the answer you're looking for? Browse other questions tagged or ask your own question.