1

I want to convert wif as Base58 string to byte array.

Private key to WIF

printf 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D507A5B8D | xxd -r -p | base58

5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ

Now I want reverse this (WIF to private key), form 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ to 800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D507A5B8D

Im using that library https://github.com/keis/base58 But I can change or better if I can use only bash without extra library

full example https://en.bitcoin.it/wiki/Wallet_import_format

monkeyUser
  • 960
  • 1
  • 7
  • 18

2 Answers2

1

You need to use the decode flag -d:

printf "5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ" | base58 -c -d | xxd -p
800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d
72aa1d

To have xxd output all on one line, give it a large column number -c flag:

$ printf "5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ" | base58 -c -d | xxd -p -c 1000
800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d

If you really want the checksum included 507A5B8D (the last 4 bytes), omit the -c flag which denotes checksum encoding:

$ printf "5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ" | base58 -d | xxd -p -c 1000
800c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d507a5b8d
JBaczuk
  • 7,278
  • 1
  • 11
  • 32
0

Here's a full script which reads the key from standard input so it doesn't get stored in a file or command history, verifies the checksum and key length, and then prints the network byte, secret key, and compressed key flag.

Requires base58 package to be installed.

#!/bin/bash
read -p "Enter WIF key: " wif_key
decoded_key=$(echo "$wif_key" | base58 -dc | xxd -p -c 256)
if [ ! -z $decoded_key ]
then
    keylen=$(echo -n $decoded_key | wc -c)
    if [ "$keylen" -ge 66 ] && [ "$keylen" -le 68 ]
    then
        echo "Network byte: ${decoded_key:0:2}";
        echo "Secret key: ${decoded_key:2:64}";
        if [ -z ${decoded_key:66:2} ]; then cpk="false"; else cpk="true"; fi
        echo "Compressed public key: $cpk";
    else
        echo "Invalid decoded key length" >&2
        $(exit 1)
    fi
else
    $(exit 1)
fi

Example

Prompt:

Enter WIF key: 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ

Output:

Network byte: 80
Secret key: 0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d
Compressed public key: false
bca-0353f40e
  • 520
  • 12