Post
Topic
Board Développement et technique
Re: [Aide] Mes 85 btc peuvent-ils être récupérés ?
by
executter
on 10/12/2017, 23:39:18 UTC
wouah 1 million qui dorment bien tranquillement Tongue

je crois comprendre que le wallet n'est pas chiffré. dans ce cas, j'ai un vieux bout de code Python qui peux t'aider.
j'ai jamais réussi à m'en sortir avec pywallet, surtout quand la db est corrompue ou d'une mauvaise version. du coup j'avais écris à l'arrache le code suivant qui scanne un wallet au complet et extrait les clés privées, sans s'occuper de la structure ou de la version du wallet. la version d'origine de mon code rebalançait les commandes d'import en rpc sur un nouveau wallet, j'ai désactivé cette partie, tu auras juste les commandes/clé privées qui s'afficheront à l'écran.

pour l'utiliser dans ton cas, tu as juste à modifier le chemin de ton wallet.dat en ligne 15, et à le lancer avec python2.

Code:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

#from jsonrpc import ServiceProxy, JSONRPCException

import re
import binascii
import hashlib
import struct

def main(args):
#    rpcaddress = 'http://user:password@172.22.10.186:9988'
#    client = ServiceProxy(rpcaddress)
    
    file = open('/home/executter/.bitcoin/wallet.dat', 'rb')
    binary_data = file.read()
    file.close()
    keys = re.findall(b'(?=\x30\x81[\xB4-\xD3]\x02\x01\x01\x04([\x01-\x20])([\x00-\xFF]{32}))', binary_data)
    for key in keys:
        size = int('0x0'+binascii.hexlify(key[0]).decode('utf8'), 16)
        private_key = key[1][:size]
        private_key = str(private_key.rjust(32, '\x00'))
        wif = private_key_to_wif(private_key)
        command = 'importprivkey %s "" false' % wif
        print(command)
#        try:
#            client.importprivkey(wif, "", False)
#        except JSONRPCException as e:
#            print e.error
    return 0

def private_key_to_wif(private_key):
    version = b'\x80'
    checksum = hashlib.sha256(hashlib.sha256(version+private_key+b'\x01').digest()).digest()[:4]
    return base58encode(version+private_key+b'\x01'+checksum)

def base58encode(b):
    """Encode bytes to a base58-encoded string"""

    b58_digits = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

    # Convert big-endian bytes to integer
    n = int('0x0' + binascii.hexlify(b).decode('utf8'), 16)

    # Divide that integer into bas58
    res = []
    while n > 0:
        n, r = divmod(n, 58)
        res.append(b58_digits[r])
    res = ''.join(res[::-1])

    # Encode leading zeros as base58 zeros
    czero = 0
    pad = 0
    for c in b:
        if c == czero: pad += 1
        else: break
    return b58_digits[0] * pad + res

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

1NHvzhH6NDNAwJFijURqscguQqBq2sJt6X, merci Grin