Formulário de contato

Nome

E-mail *

Mensagem *

Imagem

Gerador de frases BIP-39 com chave privada e banco de dados SQLite

Gerador de frases BIP-39 com chave privada e banco de dados SQLite

Publicado por em


@CanalQb no YouTube


@CanalQb

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.



Gerador de frases BIP-39 com chave privada e banco de dados SQLite

Este artigo apresenta um script avançado em Python para a geração e validação de frases mnemônicas compatíveis com o padrão BIP-39. Ele é capaz de derivar chaves privadas, converter para o formato WIF (Wallet Import Format) e armazenar os dados em bancos de dados SQLite organizados por prefixo de palavras. Essa abordagem permite gerenciamento eficiente, segmentação e reprocessamento inteligente das combinações.

O que são frases mnemônicas BIP-39?

Frases mnemônicas BIP-39 são sequências de palavras legíveis por humanos usadas para gerar determinística e de forma segura carteiras de criptomoedas. Essas frases representam uma seed criptográfica e são amplamente utilizadas para recuperar carteiras em diversos blockchains como Bitcoin, Ethereum e outros.

Funcionalidades do script Python

Este script realiza as seguintes funções:

  • Carrega um dicionário de palavras do arquivo palavras.txt
  • Gera combinações de 3 palavras para anexar a uma base fixa de 21 palavras
  • Verifica se a frase completa gera uma chave privada válida
  • Converte a chave para o formato WIF
  • Registra os dados em um banco SQLite único para cada prefixo de palavra

Requisitos do sistema

Você deve ter as seguintes bibliotecas instaladas no ambiente Python:

pip install bip_utils

Além disso, é necessário um arquivo palavras.txt contendo palavras separadas por linha, preferencialmente seguindo a lista oficial do BIP-39 para o idioma inglês.

Como o script organiza os dados

A cada nova palavra da combinação, um banco de dados SQLite diferente é criado ou reutilizado. Isso resulta em arquivos como:

  • controle_ability.db
  • controle_about.db
  • controle_access.db

Essa divisão torna o armazenamento escalável e facilita futuras análises, buscas ou reprocessamento.

Script completo em Python

from bip_utils import Bip39SeedGenerator, Bip44, Bip44Coins 
import itertools
import sqlite3
import os

d_contador = 0
c_contador = 0
valid_frases_printed = 0
current_db = None

def criar_tabela_se_nao_existir(conn):
    cursor = conn.cursor()
    cursor.execute(''' 
        CREATE TABLE IF NOT EXISTS mnemonics (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            frase TEXT NOT NULL UNIQUE,
            private_key TEXT NOT NULL,
            wif TEXT NOT NULL
        )
    ''')
    conn.commit()

def carregar_palavras():
    try:
        with open('palavras.txt', 'r') as f:
            palavras = f.read().splitlines()
        return palavras
    except FileNotFoundError:
        print("Arquivo 'palavras.txt' não encontrado.")
        return []

def verificar_mnemonica(frase): 
    global d_contador, c_contador, valid_frases_printed, current_db
    try:
        seed_bytes = Bip39SeedGenerator(frase).Generate()  
        bip44 = Bip44.FromSeed(seed_bytes, Bip44Coins.BITCOIN)
        private_key = bip44.PrivateKey().Raw().ToHex()
        wif = bip44.PrivateKey().ToWif()

        inserir_no_banco(frase, private_key, wif)
        c_contador += 1

        if c_contador % 10000 == 0:
            valid_frases_printed += 1
            print(f"Frase válida #{c_contador}: {frase}\n")

        print(f"\tFrases descartadas: {d_contador} \t|\tFrases válidas: {c_contador}", end='\r')
        
    except Exception:
        d_contador += 1
        print(f"\tFrases descartadas: {d_contador} \t|\tFrases válidas: {c_contador}", end='\r')

def inserir_no_banco(frase, private_key, wif):
    global current_db
    with sqlite3.connect(current_db) as conn:
        cursor = conn.cursor()
        try:
            cursor.execute(''' 
                INSERT INTO mnemonics (frase, private_key, wif) 
                VALUES (?, ?, ?)
            ''', (frase, private_key, wif))
            conn.commit()
        except sqlite3.IntegrityError:
            print(f"Frase duplicada, não inserida: {frase}")

def gerar_frases():
    global current_db
    palavras = carregar_palavras()
    if not palavras:
        return

    combinacoes_ultimas_palavras = itertools.product(palavras, repeat=3)

    bancos_existentes = [f for f in os.listdir() if f.startswith("controle_") and f.endswith(".db")]
    bancos_existentes.sort()

    if bancos_existentes:
        current_db = bancos_existentes[-1]
    else:
        first_word = palavras[0]
        current_db = f'controle_{first_word}.db'
        with sqlite3.connect(current_db) as conn:
            criar_tabela_se_nao_existir(conn)
        print(f"Criando novo banco de dados: {current_db}")

    ultima_frase = obter_ultima_frase()
    continuar = False if ultima_frase else True
    base_frase = 'trim skill build repair either cricket vocal riot vast wink engage puzzle poem bike wall joke august size improve note smooth'

    for combinacao in combinacoes_ultimas_palavras:
        frasecompleta = base_frase + ' ' + ' '.join(combinacao)
        nova_palavra = combinacao[0]
        db_name = f'controle_{nova_palavra}.db'

        if current_db != db_name:
            current_db = db_name
            if not os.path.exists(current_db):
                with sqlite3.connect(current_db) as conn:
                    criar_tabela_se_nao_existir(conn)
            print(f"Usando banco de dados: {current_db}")

        if ultima_frase and not continuar:
            if frasecompleta == ultima_frase:
                continuar = True
            continue

        verificar_mnemonica(frasecompleta)

def obter_ultima_frase():
    global current_db
    with sqlite3.connect(current_db) as conn:
        cursor = conn.cursor()
        cursor.execute('''SELECT frase FROM mnemonics ORDER BY ROWID DESC LIMIT 1''')
        ultima_frase = cursor.fetchone()
    return ultima_frase[0] if ultima_frase else None

if __name__ == "__main__":
    gerar_frases()

Exemplo prático de saída

Frase mnemônica:

build repair either cricket vocal riot vast wink engage ...

Resultado:

  • Chave privada em hexadecimal
  • Chave WIF
  • Armazenamento seguro em banco SQLite

Importante

Este conteúdo é educativo. O uso prático desse tipo de ferramenta exige conhecimento técnico sólido. Cabe ao usuário realizar uma autoanálise e não utilizar dados reais ou investir dinheiro sem plena compreensão dos riscos envolvidos.

Links úteis

Marcadores: Airdrop Banco de Dados Blogger Cripto Jogos Python Script Sistemas Tutorial

© junho 30, 2025 CanalQb — Python, Scripts, Automação, Airdrops e Criptomoedas | Web3 e Tech na Prática

Comentários