O que é BIP-39?

A especificação BIP-39 descreve principalmente o algoritmo e o processo para gerar carteiras determinísticas baseadas em mnemônicos (um conjunto de palavras fáceis de lembrar).

A especificação consiste em duas partes principais:

  1. Como gerar o mnemônico.
  2. Como transformar o mnemônico gerado em uma semente binária.

A seguir, explicamos como gerar carteiras determinísticas descrevendo essas duas partes.

Gerar carteira HD a partir da semente

O processo algorítmico para gerar um mnemônico é o seguinte:

  1. Crie uma sequência aleatória (entropia) de 128 a 256 bits (passo de 32 bits).
  2. Execute o SHA256 na sequência aleatória gerada no passo anterior para gerar um valor Hash e pegue os primeiros N bits do valor Hash (comprimento da entropia/32, por exemplo, para 128 bits, N = 4) como o Checksum da sequência aleatória.
  3. Adicione o Checksum ao final da sequência aleatória gerada no primeiro passo, de modo que, para o exemplo, a sequência aleatória com Checksum seja 128 + 4 = 132 bits.
  4. Separe a sequência aleatória do passo anterior em segmentos de 11 bits (split), de modo que para uma sequência de 128 bits de entropia, sejam gerados 12 segmentos (132/11=12).
  5. Mapeie cada valor contendo um segmento de 11 bits para um dicionário pré-definido de 2048 palavras.
  6. O grupo final de palavras gerado na ordem do corte é o mnemônico.

Geração de semente a partir de mnemônicos

Após a geração do mnemônico, podemos gerar a semente usando a função de geração de chaves do algoritmo PBKDF2.

O PBKDF2 requer dois parâmetros: um mnemônico e um sal. O propósito do sal é dificultar a quebra, e no BIP-39 podemos introduzir uma senha como fator de segurança adicional para proteger as sementes.

O “PBKDF2 é parte dos Padrões de Criptografia de Chave Pública (PKCS) da RSA Laboratories, especificamente PKCS #5 v2.0, também publicado como RFC 2898 do IETF.”

Após a geração do mnemônico acima, o algoritmo para geração de sementes é o seguinte:

  • O primeiro parâmetro do PBKDF2 é o mnemônico gerado acima.
  • O segundo parâmetro do PBKDF2 é o sal, que geralmente consiste em uma string e uma concatenação opcional de strings cifradas fornecidas pelo usuário.
  • O PBKDF2 usa o algoritmo HMAC-SHA512, que usa 2048 hashes para produzir um valor de 512 bits como semente.

Gerar carteira HD a partir da semente

A semente gerada acima será usada como a semente raiz da carteira HD, e a semente raiz de qualquer carteira HD pode recriar toda a carteira HD.

generate-hd-master-key.jpeg

Ao inserir a semente raiz no algoritmo HMAC-SHA512, obtém-se um hash de 512 bits, cujos 256 bits à esquerda são usados como a Chave Privada Mestre e os 256 bits à direita como o Código de Cadeia Mestre. Após isso, a Chave Pública Mestre (264 bits) pode ser gerada pela Chave Privada Mestre m.

A chave HD é gerada com os seguintes parâmetros:

  • Chave Privada Parental ou Chave Pública Parental; (ambas são chaves ECDSA descompactadas de 256 bits).
  • Código de Cadeia Parental de 256 bits.
  • Um número índice inteiro de 32 bits.

Além disso, o processo acima é recursivo e a Chave Privada Infantil no diagrama pode ser usada como a Chave Privada Parental no próximo nível.

Ao inserir (Chave Pública Parental, Código de Cadeia Parental, Número do Índice) no algoritmo HMAC-SHA512, podemos gerar suas subchaves, ajustando o Número do Índice para gerar múltiplas subchaves no mesmo nível.

Sobre a Chave Estendida

Como esta função de derivação de chave é unidirecional, todas as subchaves não podem ser usadas para derivar suas chaves parentais ou chaves irmãs no mesmo nível, apenas a chave parental e o código de cadeia parental (que são gerados a partir da chave e código de cadeia do nível de cima do Parental) podem ser usados para derivar todas as subchaves e códigos de subcadeia, e posteriormente gerar as correspondentes subchaves públicas e endereços para assinar transações.

A combinação da Chave e do Código de Cadeia é chamada de chave estendida, e a chave estendida pode ser usada para gerar todos os ramos a partir daí para baixo.

A chave fornecida na chave estendida pode ser uma chave privada ou uma chave pública, combinada com o código de cadeia, chamada respectivamente de chave privada estendida e chave pública estendida, e anotadas como (k, c) e (K, c), respectivamente, onde a chave pública K = point(k).

Podemos derivar a chave pública estendida da chave privada estendida e não vice-versa, assim, para alguns cenários de transação (por exemplo, e-commerce), uma nova chave pública e endereço pode ser gerada para cada transação a fim de receber pagamento, enquanto a chave privada estendida pode ser armazenada em uma carteira de papel ou em uma carteira de hardware para assinatura segura offline de transações. Como podemos ver, a segurança da chave pública estendida é relativamente alta e o diagrama a seguir mostra o mecanismo de transmissão da chave pública parental estendida para derivar a chave privada infantil e gerar a chave pública infantil:

Esse artigo foi útil?
Usuários que acharam isso útil: 7 de 7