As carteiras são onde as chaves privadas, públicas e os endereços são mantidos com segurança. Para gerar endereços de bitcoin ou usar uma chave privada salva para assinar uma transação para gastar uma Transação de Saída Não Gasta (unspent transaction output ou UTXO).
Geralmente, reutilizar um endereço para receber bitcoin é ruim para a privacidade na rede, transações bitcoin não são anônimas, mas pseudônimas, portanto, usar um endereço pode levar à vinculação de transações a um pseudônimo específico e esse pseudônimo pode ser rastreado. https://en.bitcoin.it/wiki/Address_reuse
Antes da proposta bip32 que abordaremos mais adiante, as carteiras geram centenas de chaves privadas, que serão usadas para gerar chaves públicas e endereços bitcoin para evitar a reutilização de endereços, fazer backup dessas chaves não é fácil e às vezes pode ser difícil.
Em 2012, Pieter Wuille e outros desenvolvedores do núcleo do Bitcoin apresentaram uma proposta de melhoria do bitcoin para uma carteira determinística (bip32), em que uma chave (semente ou seed) gerará chaves privadas ilimitadas, chaves públicas e endereços.
Em uma carteira determinística, a semente precisa ser armazenada, porque a semente, juntamente com um caminho de derivação, pode gerar todas as chaves privadas, chaves públicas e endereços novamente. Como? Vamos chegar lá também.
A semente pode ser criada a partir de um número aleatório gerado a partir de uma entropia (fonte de aleatoriedade) e esse número aleatório também pode ser codificado como 12 ou 24 palavras mnemônicas, conforme definido no bip39 https://github.com/bitcoin/bips/blob /master/bip-0039.mediawiki, pois é fácil para as pessoas usarem.
O número aleatório é de 128 bits ou 256 bits, que podem ser mapeados para 12 ou 24 palavras.
Em 128 bits de entropia. A entropia de 128 bits será transformada em hash com sha256 e os primeiros 4 bits da entropia transformada em hash serão considerados como uma Checksum (ou Soma de Verificação é uma função criptográfica simples que nos permite verificar e saber exatamente se um endereço Bitcoin está escrito corretamente).
Entropia de 128 bits + Checksum de 4 bits = 132 bits.
132 bits serão divididos por 11 que irão gerar doze 11 bits cada e serão mapeados para uma palavra em uma lista de 2048 palavras escolhidas.
Por exemplo, imitar, depender, frágil, metade, sobrinho, julgamento, cabeça, fora, super, ketchup, lunar, expandir.
Enquanto que em uma entropia de 256 bits, a entropia de 256 bits será transformada em um hash com sha256 e os primeiros 8 bits da entropia transformada em hash serão considerados como uma Checksum.
Entropia de 256 bits + Checksum de 8 bits = 264 bits
264 bits serão divididos por 11 que gerarão vinte e quatro 11 bits cada e serão mapeados para uma palavra na lista de 2048 palavras escolhidas.
Por exemplo, mãe, pessoa, nuclear, vivo, chaminé, azeitona, órfão, detectar, bom, órgão, envolver, social, onda, caminho, palácio, bom, frase, slogan, título, biblioteca, adquirir, tapete, escada, brilho.
Os usuários podem manter suas palavras mnemônicas seguras, e elas serão necessárias para que eles regenerem todas as outras chaves e endereços em sua carteira.
Como isso funciona….
Bem, as palavras mnemônicas serão adicionadas a uma frase secreta opcional ou sal e depois estendidas para uma semente de 512 bits, a frase secreta é opcional e é usada para aumentar a segurança de modo que, mesmo quando um invasor tenta obter a frase mnemônica do usuário, ele não consegue gerar a semente, uma frase mnemônica sem sal gera uma semente diferente de uma mnemônica com sal, o sal pode ser qualquer sequência de caracteres que o usuário quiser e daí força bruta é inviável. O alongamento da mnemônica para a semente é de 2.048 rodadas da função hash HMAC-SHA512 (o que basicamente significa aplicar a função HMAC-SHA512 na frase mnemônica para gerar um hash e também executar a função HMAC-SHA512 no hash resultante, repetido por 2.048 rodadas).
A semente será então dividida em duas, os 256 bits da esquerda são a chave privada mestra e os 256 bits da direita são o chaincode (um chaincode normalmente executa a lógica de negócios acordada pelos membros da rede, portanto pode ser considerada um contrato inteligente) mestre. A chave privada então é usada para gerar uma chave pública mestra (264 bits) com o algoritmo secp256k1 com um ponto gerador na curva https://en.bitcoin.it/wiki/Secp256k1. Com esses três valores, chave privada mestre, chaincode mestre e chave pública mestre, podemos gerar bilhões de chaves filhas (chave privada filha, chaincode filho e chave pública filha), e os filhos também podem gerar suas chaves filhas continuamente.
Uma chave pública com chaincode e um número de índice de (0 a N) será uma entrada de um algoritmo HMAC-SHA512 para gerar um hash de 512 bits.
O hash de 512 bits será dividido em dois 256 à esquerda (256 bits) e à direita.
O chaincode filho tem os 256 bits corretos
Os 256 bits restantes serão concatenados à chave privada pai dos 256 bits, o que gera a chave privada filha. Espere um minuto, isso não é 512 bits? Não, não é uma adição escalar. 256 bits + 256 bits é outro número de 256 bits, que será a chave privada filha e usando a função secp256k1 vamos gerar a chave pública filha, o mesmo para outras filhas, mas com um número de índice diferente.
Com esse recurso, você pode gerar milhares de chaves/pares, o que é fascinante, outro recurso incrível é que você pode gerar chaves públicas filhas sem a chave privada, espere como…
A chave pública, chaincode e número de índice serão inseridos em um HMAC-SHA512 para gerar um hash de 512 bits.
Os 512 bits serão divididos em dois bits de 256 à esquerda e 256 à direita.
O hash correto de 256 bits é o chaincode filho.
O hash esquerdo de 256 bits será concatenado com a chave pública pai (256 bits) para gerar uma chave pública de 256 bits.
Como isso é possível?.
Bem, é apenas um pouco de matemática, k é a chave privada, C é o chaincode, um número de índice i,
hash(K+C+i) = h
h+k = a chave privada filha (filho k)
G é o ponto gerador da curva elíptica, o algoritmo da curva elíptica gera a chave pública multiplicando o ponto gerador pela chave privada k.
K = G*k
G*(k+h) = a chave pública filha
G*k + G*h = G*(k+h)
Com derivação filha normal,
Na derivação filha da chave pública.
K é a chave pública pai.
K + G*h = chave pública filha
No entanto K = G*k
G*k + G*h.
Portanto, as duas chaves públicas são iguais.
A combinação de uma chave pública e um chaincode é chamada de chave pública estendida. Que pode ser usada com um número de índice para gerar chaves públicas filhas. A combinação da chave privada e do chaincode é a chave privada estendida, que pode ser usada para gerar a chave privada de um filho.
Quando a chave privada filha de uma chave pública estendida vaza, a chave privada mestra pode ser conhecida e, pior ainda, todos os seus descendentes também.
K é a chave pública pai, C é o chaincode e I é o número do índice e k é a chave privada pai (256).
h = Hash(K+C+I)
h é dividido em dois 256 bits à esquerda, 256 bits à direita
A chave privada filha é k + 256 bits restantes.
Como a chave pública estendida é fornecida, temos o código da cadeia e a chave pública pode usar força bruta para encontrar o índice da filha.
O hash da chave pública estendida (chave pública pai e código da cadeia) com número de índice será subtraído da chave privada filha vazada e o número é a chave privada pai.
k = hk (filho privado)
A chave privada do pai e o chaincode gerarão a chave privada estendida.
Portanto, podemos gerar todas as outras chaves privadas filhas.
Usamos derivação reforçada para gerar a chave privada sem a chave pública e gerar a chave pública com secp256k1.
Na derivação reforçada, hash(h) = HMAC-SHA512(chave privada pai(k) +código da cadeia (C)+ número do índice(I)).
O hash será dividido em dois à esquerda (256 bits) e à direita (256 bits)
Chave privada filha = chave privada pai (256 bits) + 256 bits restantes.
Chave pública filha K = G*k.
Portanto, as chaves filhas podem ser geradas sem o risco de sua chave privada estendida ser exposta quando a chave privada de uma filha vazar.
E você pode salvar com segurança a chave pública como uma chave pública estendida com o chaincode e, portanto, qualquer chave filha vazada não levará à vulnerabilidade de revelar a chave pública pai.
Podemos usar a chave estendida reforçada para derivar a chave privada estendida e a chave pública estendida. que usaremos em carteiras determinísticas hierárquicas (HD).
O uso de bip32 e bip39 reduz o estresse de gerenciar centenas de chaves em uma carteira, em que apenas um conjunto de palavras mnemônicas gerará todos os endereços de que se precisa durante toda a vida e muito mais.
Referências
https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch05.asciidoc
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
https://en.bitcoin.it/wiki/Address_reuse
https://en.bitcoin.it/wiki/Secp256k1
https://medium.com/@robbiehanson15/the-math-behind-bip-32-child-key-derivation-7d85f61a6681
Artigo escrito por Abubakar Sadiq Ismail. Traduzido por Marcelo Panegali
Top comments (0)