I am aware how to convert the private key into WIF format in python, now I am trying to reverse this process and convert a WIF formatted private key back into a 256-bit private key, following this guide: https://en.bitcoin.it/wiki/Wallet_import_format

This is the code to convert from 256-bit private key into WIF format:

import hashlib
import base58
import binascii

private_key_static = "0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D"
extended_key = "80"+private_key_static
first_sha256 = hashlib.sha256(binascii.unhexlify(extended_key)).hexdigest()
second_sha256 = hashlib.sha256(binascii.unhexlify(first_sha256)).hexdigest()

# add checksum to end of extended key
final_key = extended_key+second_sha256[:8]

# Wallet Import Format = base 58 encoded final_key
WIF = base58.b58encode(binascii.unhexlify(final_key))

print (WIF)

Now my attempt to reverse this process looks like this:

import hashlib
import base58
import binascii

private_key_WIF = 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ
first_encode = base58.b58decode(binascii.hexlify(private_key_WIF))
print (first_encode)

Instead of receiving the byte string, I get following error:

TypeError: a bytes-like object is required, not 'str'

(All private keys used are sample keys taken from Bitcoin Wiki.)

4 Answers 4


Don't do this: binascii.hexlify(private_key_WIF). That's not how you use binascii.hexlify. There is no hex here, and the string is not a bytes-like object. private_key_WIF is just a string. You want to pass that string directly into base58.b58decode because you want to decode the WIF (which is base58).

  • 1
    Something like this gives you the byte array to manipulate (compare results in gobittest.appspot.com/PrivateKey): private_key_WIF = "5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ" first_encode = base58.b58decode(private_key_WIF) print ([hex(ord(c)) for c in first_encode])
    – KOld
    Aug 15, 2017 at 18:59

converts WIF private key back to basic private key format

import hashlib
import base58
import binascii

private_key_WIF = input("WIF: ")
first_encode = base58.b58decode(private_key_WIF)
private_key_full = binascii.hexlify(first_encode)
private_key = private_key_full[2:-8]

simple way:

import bitcoin

private_key = "EF235AACF90D9F4AADD8C92E4B2562E1D9EB97F0DF9BA3B508258739CB013DB2"
print(bitcoin.decode_privkey(private_key, 'hex'))

simplest way

from bit import Key

# Import wif format:
privKey = Key.('L1VotKmtZRLZSnSPhLhQxfts2aqBMru2APTs4Yuc8TYJ4jNhQoGB')

# Export hex format:

privKey = Key.to_hex()

# Export int format:

privKey = Key.to_int()

# Export to bytes
privKey = Key.to_bytes()

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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