Como Converter Hex para Chaves Privadas Bitcoin com Python
Aviso de Segurança: Sempre crie uma frase de segurança única para jogos, testnets ou airdrops. Nunca use sua carteira principal para testes. Chaves privadas expostas representam risco real de perda de fundos.
O que é uma chave privada Bitcoin e por que o formato hexadecimal importa?
Uma chave privada Bitcoin é um número de 256 bits — representado em hexadecimal como uma string de 64 caracteres — que controla o acesso exclusivo a um endereço na rede. Sem ela, você não movimenta nenhum satoshi. Entender como transformar sequências hexadecimais em chaves válidas é o primeiro passo para qualquer automação séria com cripto.
Na prática, trabalhar com hex é o padrão porque facilita a leitura humana e a manipulação programática. Um valor como 1c533b6bb7f0804e pode ser convertido diretamente para bytes e passado para a biblioteca bit do Python, que cuida do resto. Aqui no @CanalQb, testamos esse fluxo com mais de 80 valores distintos — e os resultados foram consistentes.
Como o script agrupa e converte valores hexadecimais em Python?
O script divide uma string hexadecimal em grupos de tamanhos variáveis — de 1 até o comprimento total — e converte cada fragmento para decimal e binário com 64 bits preenchidos. Para cada grupo válido, a biblioteca bit tenta criar uma chave privada e extrair o endereço Bitcoin correspondente. Grupos inválidos são ignorados silenciosamente via except Exception: pass.
O except Exception: pass silencioso parece conveniente, mas esconde armadilhas. Durante nossos testes, identificamos que fragmentos hex com comprimento ímpar (ex: "abc") lançam ValueError no bytes.fromhex() — e não no PrivateKey — o que significa que erros de parsing ficam completamente ocultos. A correção é simples: filtrar grupos com comprimento par antes da tentativa de conversão. Nenhuma documentação oficial ou blog similar menciona isso diretamente.
Quais são as funções do script e o que cada uma faz?
O script é dividido em dois blocos principais. Veja o mapa de responsabilidades:
| Função / Componente | O que faz | Detalhe técnico |
|---|---|---|
| agrupar_hex() | Divide a string hex em grupos de tamanho variável | Retorna dicionário com chaves hex, dec e bin_zfill64 |
| PrivateKey.from_bytes() | Cria uma chave privada Bitcoin a partir de bytes | Biblioteca bit; lança exceção se inválida |
| chave.address | Retorna o endereço Bitcoin P2PKH (Legacy) | Formato base58, começa com "1" |
| bin_zfill64.count('1') | Conta bits '1' no binário de 64 bits | Útil para análise de entropia e distribuição |
Código Python completo e otimizado — versão @CanalQb
Nota Técnica: Instale a dependência antes de rodar: pip install bit. Scripts fornecidos são para fins educacionais e de estudo da rede Bitcoin. O autor não se responsabiliza por usos inadequados ou perda de fundos.
from bit import PrivateKey
def agrupar_hex(hex_string):
"""
Agrupa uma string hexadecimal em fragmentos de tamanhos crescentes.
Converte cada grupo para decimal e binário (64 bits preenchidos).
Otimizado por @CanalQb — canalqb.com.br
"""
resultados = {}
comprimento = len(hex_string)
for tamanho in range(1, comprimento + 1):
grupos = [hex_string[i:i + tamanho] for i in range(0, comprimento, tamanho)]
grupos_convertidos = []
for g in grupos:
# Insight @CanalQb: filtrar grupos com comprimento ímpar
# evita ValueError silencioso no bytes.fromhex()
if len(g) % 2 != 0:
grupos_convertidos.append({
'hex': g, 'dec': None, 'bin_zfill64': None
})
continue
try:
decimal = int(g, 16)
binario = bin(decimal)[2:].zfill(64) # Preenche para 64 bits
grupos_convertidos.append({
'hex': g,
'dec': decimal,
'bin_zfill64': binario
})
except ValueError:
grupos_convertidos.append({
'hex': g, 'dec': None, 'bin_zfill64': None
})
resultados[tamanho] = grupos_convertidos
return resultados
# --- Exemplo de uso real testado no @CanalQb ---
if __name__ == "__main__":
valor_hex = [
"1", "11720c4f018d51b8cebba8", "122fca143c05",
"13c96a3742f64906", "1460", "15", "153869acc5b",
"16f14fc2054cd87ee6396b33df3", "174176b015f4d",
"1757756a93", "1764f", "17e2551e", "180788e47e326c",
"1a838b13505b26867", "1a96ca8d8", "1ba534",
"1c533b6bb7f0804e09960225e44877ac", "1d3",
"1eb25c90795d61c", "1fa5ee5", "202",
"22382facd0", "22bd43c2e9354", "236fb6d5ad1f43",
"2832ed74f2b5e35ee", "2930", "2a221c58d8f",
"2c675b852189a21", "2ce00bb2136a445c71e85bf",
"2de40f", "2ec18388d544", "3", "3080d", "31",
"33e7665705359f04f28b88cf897c603c9", "340326e",
"349b84b6431a6c4ef1", "34a65911d",
"35c0d7234df7deb0f20cf7062444",
"363d541eb611abee", "3d94cd64", "483",
"4aed21170", "4b5f8303e9", "4c",
"4c5ce114686a1336e07",
"527a792b183c7f64a0e8b1f4", "556e52", "5749f",
"60f4d11574f5deee49961d9609ac6", "68f3",
"6abe1f9b67e114", "6ac3875", "6bd3b27c591",
"6cd610b53cba", "7", "730fc235c1942c1ae",
"7496cbb87cab44f", "75070a1a009d4",
"7cce5efdaccf6808", "7d4fe747", "8",
"9d18b63ac4ffdf", "9de820a7c", "a7b",
"ade6d7ce3b9b",
"af55fc59c335c8ec67ed24826",
"b10f22572c497a836ea187f2e1fc23",
"b862a62e", "bebb3940cd0fc1491", "c936",
"d2c55", "d916ce8", "dc2a04", "e0",
"e02b35a358f", "e9ae4933d6",
"ea1a5c66dcc11b5ad180", "efae164cb9e3c",
"f7051f27b09112d4", "fc07a1825367bbe"
]
for hex_value in valor_hex:
resultados = agrupar_hex(hex_value)
for tamanho, grupos in resultados.items():
for item in grupos:
if item['hex'] is None or item['dec'] is None:
continue
try:
chave = PrivateKey.from_bytes(bytes.fromhex(item['hex']))
endereco = chave.address
somabin = item['bin_zfill64'].count('1')
print(
f"Grupo {tamanho}: '{item['hex']}' | "
f"Dec: {item['dec']} | "
f"Bits-1: {somabin} | "
f"Endereço: {endereco}"
)
except Exception:
pass
Por que usar a biblioteca bit e não implementar do zero?
A biblioteca bit abstrai toda a criptografia de curva elíptica (secp256k1), a geração de endereços e a assinatura de transações. Implementar isso do zero exige conhecimento profundo de matemática de campo finito e é fonte certa de bugs de segurança. Para fins de estudo e automação, bit oferece uma API limpa e testada pela comunidade.
Este script foi otimizado para os leitores do canalqb.com.br que querem entender a estrutura interna do Bitcoin sem precisar mergulhar em baixo nível logo de cara. A partir daqui, o próximo passo natural é explorar como endereços SegWit (bech32) diferem dos Legacy — assunto que abordaremos em breve no canal.
Quais erros comuns acontecem ao converter hex para chave privada Bitcoin?
Os três erros mais frequentes são: (1) passar uma string hex com comprimento ímpar para bytes.fromhex(), o que gera ValueError; (2) tentar criar uma chave a partir de um valor maior que o limite da curva secp256k1; e (3) usar o except genérico sem logging, perdendo informações de debug valiosas.
- Comprimento ímpar: bytes.fromhex("abc") lança ValueError: non-hexadecimal number found. A solução é verificar len(g) % 2 == 0 antes da conversão — exatamente como implementamos na versão otimizada.
- Valor fora da curva: A secp256k1 aceita valores entre 1 e 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140. Qualquer hex que resulte em um inteiro fora desse range é rejeitado pela biblioteca. O except Exception: pass oculta esse caso silenciosamente.
- Debug cego: Em produção ou pesquisa, substitua o pass por except Exception as e: logging.debug(f"{item['hex']}: {e}") para rastrear quais grupos estão sendo descartados e por quê.
Aviso Financeiro: Este conteúdo é estritamente informativo e educacional. Não constitui conselho financeiro, recomendação de investimento ou orientação para uso em carteiras com valores reais. O @CanalQb não se responsabiliza por eventuais perdas decorrentes do uso inadequado das informações aqui apresentadas.
Referências e Leitura Complementar
- Repositório oficial da biblioteca bit no GitHub — documentação completa de métodos, exemplos e changelog.
- Bitcoin Developer Guide — bitcoin.org — referência técnica oficial sobre chaves, endereços e transações.
- Mais posts sobre Python no @CanalQb
- Mais posts sobre Bitcoin no @CanalQb
- Tudo sobre Cripto no @CanalQb
2026 @CanalQb — canalqb.com.br | Conteúdo original protegido. Reprodução parcial somente com crédito ao autor.

Comentários
Comente só assim vamos crescer juntos!