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:
Como gerar o mnemônico.
Como transformar o mnemônico gerado em uma semente binária.
A seguir, veremos como gerar carteiras determinísticas, descrevendo primeiro cada uma dessas duas partes.
Gerando um mnemônico
O processo algorítmico para gerar um mnemônico é o seguinte:
O processo é o seguinte:
Crie uma sequência aleatória (entropia) de 128 a 256 bits (tamanho do passo 32 bits)
Execute SHA256 na sequência aleatória gerada na etapa anterior para gerar um valor Hash e tome os primeiros N bits do valor Hash (comprimento de entropia / 32, por exemplo, 128 bits, então N = 4) como a soma de verificação da sequência aleatória.
Adicione Checksum ao final da sequência aleatória gerada na primeira etapa, de modo que para o exemplo da figura a sequência aleatória com Checksum seja 128 + 4 = 132 bits.
Separe a sequência aleatória da etapa anterior por segmentos de 11 bits (divisão), de modo que para uma sequência de comprimento de entropia de 128 bits, sejam gerados 12 segmentos (132/11 = 12).
Neste ponto, mapeie cada valor contendo um segmento de 11 bits para um dicionário predefinido de 2.048 palavras.
O último grupo de palavras gerado na ordem de corte é o mnemônico.
Geração de sementes a partir de mnemônicos
Após a geração do mnemônico podemos gerar a semente usando o algoritmo da função de geração de chave PBKDF2.
PBKDF2 requer dois parâmetros: um mnemônico e um salt. O objetivo do sal é dificultar o cracking, e no BIP-39 podemos introduzir a senha como um fator de segurança adicional para proteger as sementes.
“PBKDF2 faz parte da série Public-Key Cryptography Standards (PKCS) da RSA Laboratories, especificamente PKCS #5 v2.0, também publicado como RFC 2898 da Internet Engineering Task Force.”
Seguindo a geração mnemônica acima, o diagrama a seguir mostra o algoritmo para geração de sementes.
O primeiro parâmetro do PBKDF2 é o mnemônico gerado acima.
O segundo parâmetro do PBKDF2 é o salt, que geralmente consiste em uma string e uma concatenação opcional de strings de cifra fornecidas pelo usuário.
PBKDF2 usa o algoritmo HMAC-SHA512, que usa 2.048 hashes para produzir um valor de 512 bits como semente.
Gerando carteira HD a partir de sementes
A semente gerada acima será usada como Root Seed da carteira HD, e a Root Seed de qualquer carteira HD pode recriar toda a carteira HD.
Inserir a semente raiz no algoritmo HMAC-SHA512 produz um hash de 512 bits, dos quais os 256 bits da esquerda são usados como chave privada mestra e os 256 bits da direita como código de cadeia mestre. Depois disso, a Chave Pública Mestra (264 bits) pode ser gerada pela Chave Privada Mestra m.
Como você pode ver na figura acima, a chave HD é gerada com os seguintes parâmetros.
Chave Privada Pai ou Chave Pública Pai; (ambas são chaves ECDSA descompactadas de 256 bits).
Código de cadeia pai de 256 bits.
Um número de índice inteiro de 32 bits.
Além disso, o processo acima é recursivo e a Chave Privada Filho no diagrama pode ser usada como a Chave Privada Pai no próximo nível.
Ao inserir (chave pública pai, código da cadeia pai, número de índice) no algoritmo HMAC-SHA512, podemos gerar suas subchaves e ajustar o número de índice para gerar várias 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 pai ou chaves irmãs no mesmo nível, apenas a chave pai e o código da cadeia pai (que são gerados a partir da chave e código da cadeia do nível pai do pai) podem ser usados para derivar todas as subchaves e códigos de subcadeia e, subsequentemente, gerar as chaves subpúblicas e endereços correspondentes para assinar transações.
A combinação da chave e do código da corrente é chamada de chave estendida, e a chave estendida pode ser usada para gerar todas as ramificações a partir daí.
A chave fornecida na chave estendida pode ser uma chave privada ou uma chave pública, combinada com o código de cadeia denominado Chave Privada Estendida e Chave Pública Estendida, respectivamente, e anotada como (k, c) e (K, c), respectivamente, onde a chave pública K = ponto(k).
Podemos derivar a chave pública estendida da chave privada estendida e não vice-versa, portanto, para alguns cenários de transação (por exemplo, comércio eletrônico), uma nova chave pública e endereço podem ser gerados para cada transação para receber o pagamento, enquanto a chave privada estendida pode ser armazenada em uma carteira de papel ou em uma carteira de hardware para assinatura offline segura 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 pai estendida para derivar a chave privada filha e gerar a chave pública filha:




