Convert WIF to private key

2

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.)

Fabulous Job

Posted 2017-08-15T15:25:11.423

Reputation: 51

Answers

2

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).

Andrew Chow

Posted 2017-08-15T15:25:11.423

Reputation: 40 910

1

Something like this gives you the byte array to manipulate (compare results in http://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 2017-08-15T18:59:02.397

3

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]

print(private_key)

george7n

Posted 2017-08-15T15:25:11.423

Reputation: 31

2Welcome to Bitcoin.SE! While the code might be what is needed, it would be great if you could explain the issue and how it's fixed in your answer too :)MeshCollider 2017-11-04T23:49:28.870

Why did you do private_key_full[2:-8]?Five Points 2018-12-12T07:26:23.477

Useful resource for others: http://learnmeabitcoin.com/glossary/wif

Five Points 2018-12-12T07:36:02.787

this code above is for private keys associated with uncompressed public keys, they are 51 characters and always start with the number 5 on mainnet (9 on testnet).george7n 2018-12-14T14:13:11.233

[2:-8] gets rid of the version byte prefix, the Compression Byte suffix and the Checksum....returns only a private keygeorge7n 2018-12-14T14:16:10.343