[...]
nuss! Seria fácil? Eu nem saberia nem por onde começar
Na verdade, acho que eu iria começar tentando com final 00000, depois iria incrementando 00001, etc, até ZZZZZ... mas iria demorar uns milhões de anos manualmente...
Eu faria isso também, já que são 58 caracteres por posição e 5 posições, dariam 58^5 combinações = 656,356,768 tentativas, e em cada tentativa eu desconstruiria o base58 e faria a verificação do checksum da privkey, isso executa muito rápido.
Eu acho que levaria mais tempo pra escrever o programa do que pra executá-lo, e olha que são só 5 loops aninhados, umas 20 ou 30 linhas de código.
É uma pena que os programadores Brasileiros não estejam se interessando muito pelo Bitcoin pois só os programadores podem realmente contemplar a beleza desse software.
Fiz um programinha para brincar com essa situação. Não manjo muito de python, então se alguém tiver alguma crítica ou sugestão fico feliz em escutar.
Além do que vocês já comentaram, estou embaralhando os caracteres válidos apenas para não seguir sequencialmente (a vantagem é que podemos contar com a sorte para acelerar o processo, a desvantagem é que seria necessário gravar a ordem parar reiniciar o processamento em caso de eventual interrupção).
O programa utiliza uma função recursiva para permitir qualquer número de caracteres faltando no final da chave privada. O número de processos concorrentes é definido na linha
pool = Pool(2)
Para melhor performance sugiro utilizar o número de cores do equipamento onde será executado.
Coloquei o programinha agora para rodar, como utiliza apenas CPU deve demorar um tempo razoável para identificar a chave correta.
#!/usr/bin/python
import hashlib, binascii, random
from multiprocessing import Pool
t='123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
x='5JxQMrZfkuGKJTupDYUqjziwqdsPLtm94LdPChskdVdM'
def check(privKey):
if(len(privKey) < 51):
for n in random.sample(t, len(t)):
if(check(privKey+n)):
return True
else:
if(validwif(privKey)):
print privKey
return True
def numtowif(numpriv):
step1 = '80'+hex(numpriv)[2:].strip('L').zfill(64)
step2 = hashlib.sha256(binascii.unhexlify(step1)).hexdigest()
step3 = hashlib.sha256(binascii.unhexlify(step2)).hexdigest()
step4 = int(step1 + step3[:8] , 16)
return ''.join([t[step4/(58**l)%58] for l in range(100)])[::-1].lstrip('1')
def wiftonum(wifpriv):
return sum([t.index(wifpriv[::-1][l])*(58**l) for l in range(len(wifpriv))])/(2**32)%(2**256)
def validwif(wifpriv):
return numtowif(wiftonum(wifpriv))==wifpriv
if(__name__ == '__main__'):
if(len(x) < 51):
pool = Pool(2)
for n in random.sample(t, len(t)):
pool.map(check, [x+n])
pool.close
pool.join
else:
check(x)
Para quem quiser informações adicionais, sugiro dar uma olhada em
https://en.bitcoin.it/wiki/Private_keyhttps://en.bitcoin.it/wiki/Wallet_import_formatAbraço,
Adriano