I have coded a wallet.dat private key extractor, that allows input of a folder directory, and all (Anyname).dat files in the entire directionary to be outputted to a file called privatekey.txt it does as expected, but it doesn't give me addresses and private keys that the bitcoin core client finds with the dat file.
Did I do something wrong, which results in incorrect privatekeys?
Tip of 0.0025 BTC for help, thanks
Import re
import hashlib
import base58
import binascii
import argparse
import glob
import fileinput
import argparse
from pycoin.ecdsa import generator_secp256k1, public_pair_for_secret_exponent
location = input('Location of Wat File: ')
def from_long(v, prefix, base, charset):
l = bytearray()
while v > 0:
try:
v, mod = divmod(v, base)
l.append(charset(mod))
except Exception:
raise EncodingError("can't convert to character corresponding to %d" % mod)
l.extend([charset(0)] * prefix)
l.reverse()
return bytes(l)
def to_bytes_32(v):
v = from_long(v, 0, 256, lambda x: x)
if len(v) > 32:
raise ValueError("input to to_bytes_32 is too large")
return ((b'\0' * 32) + v)[-32:]
def bytetohex(byteStr):
return ''.join( [ "%02X" % x for x in byteStr ] ).strip()
#litecoin = [b"\x30", b"\xb0"]
bitcoin = [b"\x00", b"\x80"]
#darkcoin = [b"\x4c", b"\xcc"]
cointype = bitcoin
walletHandle = []
for file in glob.glob(str(location)+"/*.dat"):
if file.endswith('.dat'):
print(file)
walletHandle = open(file, "rb")
wallet = walletHandle.read()
privKeys_re_c=re.compile(b'\x30\x81\xD3\x02\x01\x01\x04\x20(.{32})', re.DOTALL)
privKeys=set(privKeys_re_c.findall(wallet))
print("Found %d privKeys" % len(privKeys))
for key in privKeys:
public_x, public_y = public_pair_for_secret_exponent(generator_secp256k1, int(bytetohex(key), 16))
public_key = b'\4' + to_bytes_32(public_x) + to_bytes_32(public_y)
compressed_public_key = bytes.fromhex("%02x%064x" % (2 + (public_y & 1), public_x))
m = hashlib.new('ripemd160')
m.update(hashlib.sha256(public_key).digest())
ripe = m.digest()
m = hashlib.new('ripemd160')
m.update(hashlib.sha256(compressed_public_key).digest())
ripe_c = m.digest()
extRipe = cointype[0] + ripe
extRipe_c = cointype[0] + ripe_c
chksum = hashlib.sha256(hashlib.sha256(extRipe).digest()).digest()[:4] # Step 5-7
chksum_c = hashlib.sha256(hashlib.sha256(extRipe_c).digest()).digest()[:4] # Step 5-7
addr = extRipe + chksum
addr_c = extRipe_c + chksum_c
keyWIF = cointype[1] + key
keyWIF_c = cointype[1] + key + b"\x01"
chksum = hashlib.sha256(hashlib.sha256(keyWIF).digest()).digest()[:4]
chksum_c = hashlib.sha256(hashlib.sha256(keyWIF_c).digest()).digest()[:4]
addr = keyWIF + chksum
addr_c = keyWIF_c + chksum_c
str(bytetohex(key))
private_key_static = str(bytetohex(key))
extended_key = "80"+private_key_static
first_sha256 = hashlib.sha256(binascii.unhexlify(extended_key)).hexdigest()
second_sha256 = hashlib.sha256(binascii.unhexlify(first_sha256)).hexdigest()
final_key = extended_key+second_sha256[:8]
WIF = base58.b58encode(binascii.unhexlify(final_key))
str(WIF)
f = open(str(location)+"\privatekey.txt", "a")
f.write(str(WIF)[2:99][:-1]+"\n")
continue
else:
continue
walletHandle.close()