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.

  • Yes, this is possible. But I have a strong feeling this is an XY problem – Nick ODell Mar 9 '13 at 3:36
  • Clarification (well, stating in explicit terms) above. – Austin Burk Mar 9 '13 at 3:50
  • Is there some reason why you want to send your bitcoins to an unspendable public key? – Nick ODell Mar 9 '13 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?" – Austin Burk Mar 9 '13 at 5:04
18

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

  • A handy utility that does each step: gobittest.appspot.com/PrivateKey – Stephen Gornick Mar 9 '13 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. – Austin Burk Mar 9 '13 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. – Austin Burk Mar 11 '13 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. – kellrobinson Nov 10 '14 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) – Frankenmint Mar 20 '16 at 11:02
4

If you don't want to compute the key manually, there's a useful command-line utility for this called bitcoin-tool:

$ ./bitcoin-tool \
  --input-file <(echo -n 'Hi guys!' | openssl dgst -sha256 -binary) \
  --input-format raw \
  --input-type private-key \
  --network bitcoin \
  --output-type private-key-wif \
  --output-format base58check \
  --public-key-compression uncompressed
5JhvsapkHeHjy2FiUQYwXh1d74evuMd3rGcKGnifCdFR5G8e6nH

Passing --output-type all yields even more interesting output:

address.hex:00a25b865343d3fcc08994005f496265b48349e363
address.base58:13GC5PkewvCycNNVVUuwJEnxPr6Lz
address.base58check:1FoU7KqP2xnWBo7sULZn5EynWdbYVVBXaG
public-key-ripemd160.hex:a25b865343d3fcc08994005f496265b48349e363
public-key-ripemd160.base58:3GC5PkewvCycNNVVUuwJEnxPr6Lz
public-key-ripemd160.base58check:FoU7KqP2xnWBo7sULZn5EynWdbYSDL49B
public-key-sha256.hex:12317a311bea88a372138319d2ab671ef9fed4ada741d91f368a4c6c7b3c146a
public-key-sha256.base58:2E26bn7S3ByBj1KWn8zjTVzAYVRD5osYmo1HAP5UfAPB
public-key-sha256.base58check:91iv7C9DcPrrReTtBJsxMTRFHKm2yJwsYkz1mbDk51ePCC54y
public-key.hex:048c6d8595550811bef5592e56f33f306cd07561b3f65ab10d9188fc0aa89aba7a564aa08b528475baadf0a0035633894248269f266c3c71b67e574dd368275c1c
public-key.base58:QHH5Zy6u7FsTPjLdMLp4yVdL6cFYo2yh8XoptynaU8HEqheCNEwJiVCfCpm6BBBuCXVB2ESny8qAAEQN3Efc1kq1
public-key.base58check:3dLjoxm8unYpP6iKX95T5YWXVA7xbVhmyJrnKoWYjeTFWqKTmgVoUSyjXd1D5KWNnzYgcGw5fn8WefUjnTDnXBVrTtkTGE
private-key-wif.hex:807542fb6685f9fd8f37d56faf62f0bb4563684a51539e4b26f0840db361e0027c
private-key-wif.base58:fAHHP3kbUP5cDBoAfwrZYCR4WC6BnnQCEaQPMaNdrRyCF
private-key-wif.base58check:5JhvsapkHeHjy2FiUQYwXh1d74evuMd3rGcKGnifCdFR5G8e6nH
private-key.hex:7542fb6685f9fd8f37d56faf62f0bb4563684a51539e4b26f0840db361e0027c
private-key.base58:8tjwWnNgm3DrBEwCsPqbSAPkCspRRmA8ftHjQTycL3gw
private-key.base58check:teHuNfDBiki1sSSD73SeGVtTq1hDky8TYY3cfuxkPmuftixzQ
  • idk how i missed it, but this is one way to get address to hash160 hex., public-key-ripemd160.hex:a25b865343d3fcc08994005f496265b48349e363 – AMB Oct 12 '17 at 6:03

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