A especificação BIP-39 descreve principalmente o algoritmo e o processo para gerar carteiras determinísticas com base 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, analisamos como gerar carteiras determinísticas, descrevendo primeiro cada uma dessas duas partes.
Geração de 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 (passo de 32 bits)
Execute o SHA256 na sequência aleatória gerada na etapa anterior para gerar um valor Hash e pegue os primeiros N bits do valor Hash (comprimento da entropia / 32, por exemplo, 128 bits, então N = 4) como a Soma de Verificação (Checksum) da sequência aleatória.
Adicione a Soma de Verificação ao final da sequência aleatória gerada na primeira etapa, de modo que para o exemplo na figura a sequência aleatória com a Soma de Verificação tenha 132 bits (128 + 4).
Separe a sequência aleatória da etapa anterior por segmentos de 11 bits (divida), de modo que para uma sequência de 128 bits de comprimento de entropia, 12 segmentos sejam gerados (132 / 11 = 12).
Neste ponto, mapeie cada valor contendo um segmento de 11 bits para um dicionário predefinido de 2048 palavras.
O grupo final de palavras geradas 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 chave com o algoritmo PBKDF2.
PBKDF2 requer dois parâmetros: um mnemônico e um salt. O propósito do salt é tornar a quebra mais difícil, e no BIP-39 podemos introduzir uma frase secreta (passphrase) 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 de mnemônico acima, o diagrama a seguir mostra o algoritmo para geração de semente.
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 utiliza 2048 hashes para produzir um valor de 512 bits como semente.
Geração de carteira HD a partir de sementes
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.
A entrada da Semente Raiz no algoritmo HMAC-SHA512 produz um hash de 512 bits, sendo que os 256 bits da esquerda são usados como Chave Mestra Privada e os 256 bits da direita como Código de Cadeia Mestre. Após isso, 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 de 256 bits não comprimidas).
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 Filha Privada no diagrama pode ser usada como a Chave Pai Privada no próximo nível.
Ao inserir (Chave Pública Pai, Código de Cadeia Pai, Número de Índice) no algoritmo HMAC-SHA512, podemos gerar suas subchaves, e podemos ajustar o Número de Índice para gerar múltiplas subchaves no mesmo nível.
Sobre 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 de cadeia pai (que são gerados a partir da chave e código de cadeia do Pai do nível Pai) podem ser usados para derivar todas as subchaves e códigos de cadeia filha, e subsequentemente gerar as chaves públicas e endereços correspondentes 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í.
A chave fornecida na chave estendida pode ser uma chave privada ou uma chave pública, combinada com o código de cadeia chamada Chave Privada Estendida e Chave Pública Estendida, respectivamente, e denotada 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 o contrário, então para alguns cenários de transação (por exemplo, e-commerce), uma nova chave pública e endereço podem ser gerados para cada transação para 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 pai estendida para derivar a chave filha privada e gerar a chave pública filha:



