
Como Usar a Testnet Chainphon e se Preparar para o Lançamento Oficial
Sempre crie uma frase de segurança única para jogos, testnets ou airdrops e evite usar sua carteira principal.
Script Python para Análise e Geração de Endereços Bitcoin com Entropia
Este artigo apresenta um script em Python que gera e valida endereços Bitcoin comprimidos a partir de intervalos numéricos amplos, calcula a entropia dos valores, e armazena os resultados em arquivos CSV, além de registrar endereços encontrados em arquivos TXT para facilitar análises.
Introdução ao Script
O script trabalha com faixas numéricas muito grandes para gerar possíveis chaves privadas Bitcoin. A partir dessas chaves, ele calcula os endereços correspondentes, verifica se pertencem a uma lista pré-definida e registra os dados gerados, incluindo uma métrica de entropia para cada vetor de bytes gerado.
Definição das Faixas e Endereços Alvo
O código usa três faixas numéricas distintas para geração das chaves e uma lista de endereços Bitcoin comprimidos para validação:
faixas
: Três tuplas com valores iniciais e finais para geração dos números inteiros usados na criação das chaves.enderecos_btc_lista
: Conjunto de endereços Bitcoin para verificar correspondências durante a geração.
Funções Principais do Script
Cálculo de Entropia
A função calcular_entropia(bytes_array)
calcula a entropia de Shannon para o vetor de bytes que representa a chave, mostrando o nível de aleatoriedade do dado.
Geração de Chaves e Endereços
As funções gerar_wif_comprimido(valor)
e gerar_endereco_btc_comprimido(valor)
utilizam a biblioteca bit
para converter o valor inteiro em chave privada no formato WIF comprimido e gerar o endereço Bitcoin correspondente.
Geração do Vetor de Bytes
gerar_vetor_bytes(v)
transforma o número inteiro em uma lista de 32 bytes, no formato esperado para processamento criptográfico.
Processamento dos Valores
A função processar_ref_intervalo(ref_intervalo)
divide as faixas em valores uniformemente espaçados, processa cada valor e seus vizinhos (v-1
, v
, v+1
), calcula entropia, gera chaves e endereços, verifica correspondências e grava os dados em arquivos CSV. Também salva arquivos TXT para endereços encontrados.
Estrutura de Arquivos Gerados
- CSV: Para cada faixa e intervalo de referência, um arquivo CSV é criado na pasta
csv
contendo índices, valores, vetores, entropia, chaves WIF e endereços Bitcoin. - TXT: Para cada endereço Bitcoin encontrado na lista alvo, um arquivo TXT é gerado na pasta
achados
contendo o endereço e a chave WIF correspondente.
Considerações Técnicas e Uso
O script processa de forma iterativa aumentando o intervalo de referência, dobrando seu tamanho até o limite máximo definido (2**159
). Para não sobrecarregar a memória e CPU, o processamento é dividido em etapas de tamanho definido (step_size = 1000
), e a coleta de lixo (gc.collect()
) é chamada após cada etapa.
Recomendações de Segurança
Este código é indicado para fins educacionais, pesquisas e auditoria. O uso em ambientes de produção e manipulação real de ativos deve ser realizado com extremo cuidado, sempre avaliando os riscos envolvidos e realizando autoanálise detalhada antes de investir ou movimentar criptomoedas.
Requisitos
- Python 3.x
- Bibliotecas:
bit
,math
,csv
,os
,gc
- Biblioteca
bit
# Lista de pares início e fim como strings (com aspas removidas)
faixas = [
(2, 3),
(4, 7),
(8, 15),
(16, 31),
(32, 63),
(64, 127),
(128, 255),
(256, 511),
(512, 1023),
(1024, 2047),
(2048, 4095),
(4096, 8191),
(8192, 16383),
(16384, 32767),
(32768, 65535),
(65536, 131071),
(131072, 262143),
(262144, 524287),
(524288, 1048575),
(1048576, 2097151),
(2097152, 4194303),
(4194304, 8388607),
(8388608, 16777215),
(16777216, 33554431),
(33554432, 67108863),
(67108864, 134217727),
(134217728, 268435455),
(268435456, 536870911),
(536870912, 1073741823),
(1073741824, 2147483647),
(2147483648, 4294967295),
(4294967296, 8589934591),
(8589934592, 17179869183),
(17179869184, 34359738367),
(34359738368, 68719476735),
(68719476736, 137438953471),
(137438953472, 274877906943),
(274877906944, 549755813887),
(549755813888, 1099511627775),
(1099511627776, 2199023255551),
(2199023255552, 4398046511103),
(4398046511104, 8796093022207),
(8796093022208, 17592186044415),
(17592186044416, 35184372088831),
(35184372088832, 70368744177663),
(70368744177664, 140737488355327),
(140737488355328, 281474976710655),
(281474976710656, 562949953421311),
(562949953421312, 1125899906842623),
(1125899906842624, 2251799813685247),
(2251799813685248, 4503599627370495),
(4503599627370496, 9007199254740991),
(9007199254740992, 18014398509481983),
(18014398509481984, 36028797018963967),
(36028797018963968, 72057594037927935),
(72057594037927936, 144115188075855871),
(144115188075855872, 288230376151711743),
(288230376151711744, 576460752303423487),
(576460752303423488, 1152921504606846975),
(1152921504606846976, 2305843009213693951),
(2305843009213693952, 4611686018427387903),
(4611686018427387904, 9223372036854775807),
(9223372036854775808, 18446744073709551615),
(18446744073709551616, 36893488147419103231),
(36893488147419103232, 73786976294838206463),
(73786976294838206464, 147573952589676412927),
(147573952589676412928, 295147905179352825855),
(295147905179352825856, 590295810358705651711),
(590295810358705651712, 1180591620717411303423),
(1180591620717411303424, 2361183241434822606847),
(2361183241434822606848, 4722366482869645213695),
(4722366482869645213696, 9444732965739290427391),
(9444732965739290427392, 18889465931478580854783),
(18889465931478580854784, 37778931862957161709567),
(37778931862957161709568, 75557863725914323419135),
(75557863725914323419136, 151115727451828646838271),
(151115727451828646838272, 302231454903657293676543),
(302231454903657293676544, 604462909807314587353087),
(604462909807314587353088, 1208925819614629174706175),
(1208925819614629174706176, 2417851639229258349412351),
(2417851639229258349412352, 4835703278458516698824703),
(4835703278458516698824704, 9671406556917033397649407),
(9671406556917033397649408, 19342813113834066795298815),
(19342813113834066795298816, 38685626227668133590597631),
(38685626227668133590597632, 77371252455336267181195263),
(77371252455336267181195264, 154742504910672534362390527),
(154742504910672534362390528, 309485009821345068724781055),
(309485009821345068724781056, 618970019642690137449562111),
(618970019642690137449562112, 1237940039285380274899124223),
(1237940039285380274899124224, 2475880078570760549798248447),
(2475880078570760549798248448, 4951760157141521099596496895),
(4951760157141521099596496896, 9903520314283042199192993791),
(9903520314283042199192993792, 19807040628566084398385987583),
(19807040628566084398385987584, 39614081257132168796771975167),
(39614081257132168796771975168, 79228162514264337593543950335),
(79228162514264337593543950336, 158456325028528675187087900671),
(158456325028528675187087900672, 316912650057057350374175801343),
(316912650057057350374175801344, 633825300114114700748351602687),
(633825300114114700748351602688, 1267650600228229401496703205375),
(1267650600228229401496703205376, 2535301200456458802993406410751),
(2535301200456458802993406410752, 5070602400912917605986812821503),
(5070602400912917605986812821504, 10141204801825835211973625643007),
(10141204801825835211973625643008, 20282409603651670423947251286015),
(20282409603651670423947251286016, 40564819207303340847894502572031),
(40564819207303340847894502572032, 81129638414606681695789005144063),
(81129638414606681695789005144064, 162259276829213363391578010288127),
(162259276829213363391578010288128, 324518553658426726783156020576255),
(324518553658426726783156020576256, 649037107316853453566312041152511),
(649037107316853453566312041152512, 1298074214633706907132624082305023),
(1298074214633706907132624082305024, 2596148429267413814265248164610047),
(2596148429267413814265248164610048, 5192296858534827628530496329220095),
(5192296858534827628530496329220096, 10384593717069655257060992658440191),
(10384593717069655257060992658440192, 20769187434139310514121985316880383),
(20769187434139310514121985316880384, 41538374868278621028243970633760767),
(41538374868278621028243970633760768, 83076749736557242056487941267521535),
(83076749736557242056487941267521536, 166153499473114484112975882535043071),
(166153499473114484112975882535043072, 332306998946228968225951765070086143),
(332306998946228968225951765070086144, 664613997892457936451903530140172287),
(664613997892457936451903530140172288, 1329227995784915872903807060280344575),
(1329227995784915872903807060280344576, 2658455991569831745807614120560689151),
(2658455991569831745807614120560689152, 5316911983139663491615228241121378303),
(5316911983139663491615228241121378304, 10633823966279326983230456482242756607),
(10633823966279326983230456482242756608, 21267647932558653966460912964485513215),
(21267647932558653966460912964485513216, 42535295865117307932921825928971026431),
(42535295865117307932921825928971026432, 85070591730234615865843651857942052863),
(85070591730234615865843651857942052864, 170141183460469231731687303715884105727),
(170141183460469231731687303715884105728, 340282366920938463463374607431768211455),
(340282366920938463463374607431768211456, 680564733841876926926749214863536422911),
(680564733841876926926749214863536422912, 1361129467683753853853498429727072845823),
(1361129467683753853853498429727072845824, 2722258935367507707706996859454145691647),
(2722258935367507707706996859454145691648, 5444517870735015415413993718908291383295),
(5444517870735015415413993718908291383296, 10889035741470030830827987437816582766591),
(10889035741470030830827987437816582766592, 21778071482940061661655974875633165533183),
(21778071482940061661655974875633165533184, 43556142965880123323311949751266331066367),
(43556142965880123323311949751266331066368, 87112285931760246646623899502532662132735),
(87112285931760246646623899502532662132736, 174224571863520493293247799005065324265471),
(174224571863520493293247799005065324265472, 348449143727040986586495598010130648530943),
(348449143727040986586495598010130648530944, 696898287454081973172991196020261297061887),
(696898287454081973172991196020261297061888, 1393796574908163946345982392040522594123775),
(1393796574908163946345982392040522594123776, 2787593149816327892691964784081045188247551),
(2787593149816327892691964784081045188247552, 5575186299632655785383929568162090376495103),
(5575186299632655785383929568162090376495104, 11150372599265311570767859136324180752990207),
(11150372599265311570767859136324180752990208, 22300745198530623141535718272648361505980415),
(22300745198530623141535718272648361505980416, 44601490397061246283071436545296723011960831),
(44601490397061246283071436545296723011960832, 89202980794122492566142873090593446023921663),
(89202980794122492566142873090593446023921664, 178405961588244985132285746181186892047843327),
(178405961588244985132285746181186892047843328, 356811923176489970264571492362373784095686655),
(356811923176489970264571492362373784095686656, 713623846352979940529142984724747568191373311),
(713623846352979940529142984724747568191373312, 1427247692705959881058285969449495136382746623),
(1427247692705959881058285969449495136382746624, 2854495385411919762116571938898990272765493247),
(2854495385411919762116571938898990272765493248, 5708990770823839524233143877797980545530986495),
(5708990770823839524233143877797980545530986496, 11417981541647679048466287755595961091061972991),
(11417981541647679048466287755595961091061972992, 22835963083295358096932575511191922182123945983),
(22835963083295358096932575511191922182123945984, 45671926166590716193865151022383844364247891967),
(45671926166590716193865151022383844364247891968, 91343852333181432387730302044767688728495783935),
(91343852333181432387730302044767688728495783936, 182687704666362864775460604089535377456991567871),
(182687704666362864775460604089535377456991567872, 365375409332725729550921208179070754913983135743),
(365375409332725729550921208179070754913983135744, 730750818665451459101842416358141509827966271487),
(730750818665451459101842416358141509827966271488, 1461501637330902918203684832716283019655932542975),
]
# Lista de endereços Bitcoin fornecidos
enderecos_btc_lista = set([
"1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH",
"1CUNEBjYrCn2y1SdiUMohaKUi4wpP326Lb",
"19ZewH8Kk1PDbSNdJ97FP4EiCjTRaZMZQA",
"1EhqbyUMvvs7BfL8goY6qcPbD6YKfPqb7e",
"1E6NuFjCi27W5zoXg8TRdcSRq84zJeBW3k",
"1PitScNLyp2HCygzadCh7FveTnfmpPbfp8",
"1McVt1vMtCC7yn5b9wgX1833yCcLXzueeC",
"1M92tSqNmQLYw33fuBvjmeadirh1ysMBxK",
"1CQFwcjw1dwhtkVWBttNLDtqL7ivBonGPV",
"1LeBZP5QCwwgXRtmVUvTVrraqPUokyLHqe",
"1PgQVLmst3Z314JrQn5TNiys8Hc38TcXJu",
"1DBaumZxUkM4qMQRt2LVWyFJq5kDtSZQot",
"1Pie8JkxBT6MGPz9Nvi3fsPkr2D8q3GBc1",
"1ErZWg5cFCe4Vw5BzgfzB74VNLaXEiEkhk",
"1QCbW9HWnwQWiQqVo5exhAnmfqKRrCRsvW",
"1BDyrQ6WoF8VN3g9SAS1iKZcPzFfnDVieY",
"1HduPEXZRdG26SUT5Yk83mLkPyjnZuJ7Bm",
"1GnNTmTVLZiqQfLbAdp9DVdicEnB5GoERE",
"1NWmZRpHH4XSPwsW6dsS3nrNWfL1yrJj4w",
"1HsMJxNiV7TLxmoF6uJNkydxPFDog4NQum",
"14oFNXucftsHiUMY8uctg6N487riuyXs4h",
"1L2GM8eE7mJWLdo3HZS6su1832NX2txaac",
"1LHtnpd8nU5VHEMkG2TMYYNUjjLc992bps",
"1FRoHA9xewq7DjrZ1psWJVeTer8gHRqEvR",
"187swFMjz1G54ycVU56B7jZFHFTNVQFDiu",
"1PWABE7oUahG2AFFQhhvViQovnCr4rEv7Q",
"1PWCx5fovoEaoBowAvF5k91m2Xat9bMgwb",
"1Be2UF9NLfyLFbtm3TCbmuocc9N1Kduci1",
"14iXhn8bGajVWegZHJ18vJLHhntcpL4dex",
"1HBtApAFA9B2YZw3G2YKSMCtb3dVnjuNe2",
"122AJhKLEfkFBaGAd84pLp1kfE7xK3GdT8",
"1F3JRMWudBaj48EhwcHDdpeuy2jwACNxjP",
"1MEzite4ReNuWaL5Ds17ePKt2dCxWEofwk",
"1NpnQyZ7x24ud82b7WiRNvPm6N8bqGQnaS",
"15z9c9sVpu6fwNiK7dMAFgMYSK4GqsGZim",
"15K1YKJMiJ4fpesTVUcByoz334rHmknxmT",
"1KYUv7nSvXx4642TKeuC2SNdTk326uUpFy",
"1LzhS3k3e9Ub8i2W1V8xQFdB8n2MYCHPCa",
"17aPYR1m6pVAacXg1PTDDU7XafvK1dxvhi",
"15c9mPGLku1HuW9LRtBf4jcHVpBUt8txKz",
"1Dn8NF8qDyyfHMktmuoQLGyjWmZXgvosXf",
"1HAX2n9Uruu9YDt4cqRgYcvtGvZj1rbUyt",
"1Kn5h2qpgw9mWE5jKpk8PP4qvvJ1QVy8su",
"1AVJKwzs9AskraJLGHAZPiaZcrpDr1U6AB",
"1Me6EfpwZK5kQziBwBfvLiHjaPGxCKLoJi",
"1NpYjtLira16LfGbGwZJ5JbDPh3ai9bjf4",
"16jY7qLJnxb7CHZyqBP8qca9d51gAjyXQN",
"18ZMbwUFLMHoZBbfpCjUJQTCMCbktshgpe",
"13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so",
"1BY8GQbnueYofwSuFAT3USAhGjPrkxDdW9",
"1MVDYgVaSN6iKKEsbzRUAYFrYJadLYZvvZ",
"19vkiEajfhuZ8bs8Zu2jgmC6oqZbWqhxhG",
"19YZECXj3SxEZMoUeJ1yiPsw8xANe7M7QR",
"1JTK7s9YVYywfm5XUH7RNhHJH1LshCaRFR",
"12VVRNPi4SJqUTsp6FmqDqY5sGosDtysn4",
"1FWGcVDK3JGzCC3WtkYetULPszMaK2Jksv",
"1J36UjUByGroXcCvmj13U6uwaVv9caEeAt",
"1Bxk4CQdqL9p22JEtDfdXMsng1XacifUtE",
"1BCf6rHUW6m3iH2ptsvnjgLruAiPQQepLe",
"1Kh22PvXERd2xpTQk3ur6pPEqFeckCJfAr",
"1L12FHH2FHjvTviyanuiFVfmzCy46RRATU",
"19eVSDuizydXxhohGh8Ki9WY9KsHdSwoQC",
"15ANYzzCp5BFHcCnVFzXqyibpzgPLWaD8b",
"1KCgMv8fo2TPBpddVi9jqmMmcne9uSNJ5F",
"1CMjscKB3QW7SDyQ4c3C3DEUHiHRhiZVib",
"12JzYkkN76xkwvcPT6AWKZtGX6w2LAgsJg",
"1NLbHuJebVwUZ1XqDjsAyfTRUPwDQbemfv",
"17s2b9ksz5y7abUm92cHwG8jEPCzK3dLnT",
"1PXAyUB8ZoH3WD8n5zoAthYjN15yN5CVq5",
"1Fo65aKq8s8iquMt6weF1rku1moWVEd5Ua",
"16RGFo6hjq9ym6Pj7N5H7L1NR1rVPJyw2v",
"1QKBaU6WAeycb3DbKbLBkX7vJiaS8r42Xo",
"1CD91Vm97mLQvXhrnoMChhJx4TP9MaQkJo",
"19GpszRNUej5yYqxXoLnbZWKew3KdVLkXg",
"1MUJSJYtGPVGkBCTqGspnxyHahpt5Te8jy",
"14u4nA5sugaswb6SZgn5av2vuChdMnD9E5"
])
import hashlib
import math
import base58
from bit import Key
import csv
import os
import gc
# Função para calcular a entropia de Shannon
def calcular_entropia(bytes_array):
total_bytes = len(bytes_array)
valor_count = {byte: bytes_array.count(byte) for byte in set(bytes_array)}
entropia = 0
for count in valor_count.values():
probabilidade = count / total_bytes
entropia -= probabilidade * math.log2(probabilidade)
return entropia
# Função para gerar WIF comprimido a partir de um valor
def gerar_wif_comprimido(valor):
chave_privada = Key.from_int(valor)
return chave_privada.to_wif()
# Função para gerar o endereço BTC comprimido a partir de uma chave privada
def gerar_endereco_btc_comprimido(valor):
chave_privada = Key.from_int(valor)
return chave_privada.address
# Função para gerar o vetor de 32 bytes no formato [0, 0, 0, 0, ..., v, 0, 0]
def gerar_vetor_bytes(v):
vetor_bytes = [0] * 32
for i in range(31, -1, -1):
vetor_bytes[i] = v & 0xFF
v >>= 8
return vetor_bytes
max_ref_intervalo = 2**159 # Esse é o valor máximo do loop
# Exemplo de divisão em pedaços menores para não sobrecarregar
step_size = 1000 # A cada 1000, você incrementa o valor
# Função para processar os valores (já definida anteriormente)
def processar_ref_intervalo(ref_intervalo):
for faixa in faixas:
orig_inicio, orig_fim = faixa
# Calculando o intervalo total e tamanho do passo
intervalo_total = orig_fim - orig_inicio
tamanho_passo = intervalo_total / (ref_intervalo - 1) if ref_intervalo > 1 else intervalo_total
# Gerando os valores uniformemente distribuídos
valores = [int(orig_inicio + i * tamanho_passo) for i in range(ref_intervalo)]
# Garantir que a pasta 'csv' exista
os.makedirs('csv', exist_ok=True)
nome_arquivo = os.path.join('csv', f"{ref_intervalo}_{orig_inicio}-{orig_fim}.csv")
# Abrindo o arquivo CSV para escrita
with open(nome_arquivo, mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file, delimiter=';')
# Escrevendo o cabeçalho
writer.writerow(['Index', 'Valor', 'Vetor', 'Entropia', 'WIF Comprimido', 'Endereço BTC Comprimido'])
# Processando os valores da faixa
for i, v in enumerate(valores):
# Valores v, v+1, v-1
valores_iterados = [v-1, v, v+1]
for v_iter in valores_iterados:
# Converte v_iter para vetor de 32 bytes
vetor_bytes = gerar_vetor_bytes(v_iter)
# Calcula a entropia de Shannon
entropia = calcular_entropia(vetor_bytes)
# Gera WIF comprimido
wif = gerar_wif_comprimido(v_iter)
# Gera o endereço BTC comprimido
btc = gerar_endereco_btc_comprimido(v_iter)
# Verifica se o endereço BTC está na lista
if btc in enderecos_btc_lista:
# Garantir que a pasta 'achados' exista
os.makedirs('achados', exist_ok=True)
# Salva em arquivo TXT dentro da pasta 'achados' com nome {btc}-{wif}.txt
nome_arquivo_achou = os.path.join('achados', f"{btc}-{wif}.txt")
with open(nome_arquivo_achou, mode='w', encoding='utf-8') as f:
f.write(f"Endereço BTC: {btc}\n")
f.write(f"WIF Comprimido: {wif}\n")
# Escreve os dados no arquivo CSV
writer.writerow([f"{i+1:03}", v_iter, vetor_bytes, f"{entropia:.6f}", wif, btc])
# Imprime os resultados no terminal no formato desejado
vetor_bytes_str = str(vetor_bytes) # Convertendo para o formato de lista [0, 0, 0, ...]
print(f"{i+1:03}: {v} - Entropia: {entropia:.6f} - WIF Comprimido: {wif} - Endereço BTC Comprimido: {btc}", end="\r")
# Inicializando o ref_intervalo com 1 e dobrando a cada iteração até atingir 2^159
ref_intervalo = 1
while ref_intervalo <= max_ref_intervalo:
#print(f"Iniciando processamento com ref_intervalo = {ref_intervalo}")
processar_ref_intervalo(ref_intervalo)
gc.collect()
# Dobrar o valor de ref_intervalo para a próxima iteração
ref_intervalo *= 2