5

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
  • 81
  • 1
  • 1
  • 5

4 Answers4

9

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)

pbies
  • 149
  • 9
george7n
  • 91
  • 1
  • 2
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).

Ava Chow
  • 70,382
  • 5
  • 81
  • 161
  • 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 Aug 15 '17 at 18:59
0

simple way:

import bitcoin

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

0

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

fredsta98
  • 15
  • 5