MSTR Cat

Blockchain/Nível II · Mecânica/2.1 Criptografia/Lição 3

Chaves privadas, chaves públicas e secp256k1

O número inteiro, a curva e a porta de mão única

MateriaisUm explorador de blocos que exibe dados de witnessA. M. Antonopoulos & D. A. Harding, Mastering Bitcoin, 3ª ed. (2023), cap. 4

Curiosidade

  1. Por que multiplicar um ponto por um número leva milissegundos, enquanto invertê-lo levaria mais tempo do que a idade do universo?
  2. O que torna a secp256k1 estruturalmente diferente das curvas NIST usadas na maioria das outras assinaturas digitais?
  3. Como um valor de 32 bytes pode controlar ativos no valor de bilhões sem revelar quem os controla?

Explorar

  1. A chave privada do Bitcoin é um número inteiro aleatório entre 1 e n−1, onde n é a ordem do ponto gerador da curva. Esse número n é aproximadamente 1,158 × 10^77, um número de 78 dígitos, não muito abaixo do número estimado de átomos no universo observável (cerca de 10^80). A chave pública é derivada por multiplicação escalar: multiplicando esse inteiro k pelo ponto gerador fixo G na curva elíptica. Como G é constante para todos os usuários do Bitcoin, cada valor único de k produz um ponto K único e determinístico na curva.
  2. A curva secp256k1 é definida pela equação y² = x³ + 7 em um campo primo onde p = 2^256 − 2^32 − 977. Esse conjunto específico de parâmetros foi estabelecido no padrão SEC 2 pela Certicom. A escolha da secp256k1 em 2009 foi incomum; trata-se de uma curva Koblitz, nomeada em homenagem a Neal Koblitz, cuja estrutura especial (um endomorfismo eficientemente computável) permite uma multiplicação escalar mais rápida, e cujos parâmetros deixam pouco espaço para escolhas ocultas, ao contrário das curvas geradas a partir de sementes aleatórias inexplicáveis. Satoshi Nakamoto nunca explicou essa seleção.
  3. A multiplicação escalar é rápida porque as implementações utilizam o algoritmo de dobrar e somar, processando a representação binária da chave privada bit a bit. Dobrar um ponto e adicionar outro ponto são operações básicas na curva que os computadores executam em microssegundos. No entanto, reverter essa operação — obter k a partir de K e G — é conhecido como o problema do logaritmo discreto em curvas elípticas (ECDLP). Não existe um algoritmo clássico eficiente para ECDLP em secp256k1; a busca por força bruta no espaço de chaves é computacionalmente inviável, proporcionando segurança de aproximadamente 128 bits contra ataques clássicos.
  4. Chaves públicas são serializadas em formatos específicos para armazenamento e transmissão. Uma chave pública não compactada tem 65 bytes de comprimento, começando com o prefixo 04 seguido pelas coordenadas x e y. Uma chave pública compactada tem 33 bytes, utilizando os prefixos 02 ou 03 para indicar a paridade da coordenada y, permitindo a reconstrução a partir apenas da coordenada x. O Taproot, ativado em novembro de 2021, utiliza uma otimização adicional chamada chaves somente-x (x-only), que têm 32 bytes e omitem completamente o prefixo, contando com as propriedades do esquema de assinatura Schnorr.
  5. A relação entre as chaves privada e pública é estritamente unidirecional. Compartilhar uma chave pública não revela nada sobre a chave privada, pois o problema do logaritmo discreto permanece sem solução para esse tamanho de curva. Por outro lado, ter a chave privada permite o cálculo imediato da chave pública correspondente. Essa assimetria forma a base do modelo de propriedade do Bitcoin: qualquer pessoa pode verificar se uma assinatura foi criada por uma determinada chave privada sem nunca ver a própria chave.
  6. Para verificar esses mecanismos, abra qualquer explorador de blocos e localize uma entrada de transação. Para um gasto nativo SegWit (P2WPKH), o witness contém a assinatura e a chave pública compactada de 33 bytes; para um gasto por caminho de chave Taproot, a chave de 32 bytes está na própria saída e o witness contém apenas a assinatura. Compare isso com o endereço da saída anterior; enquanto o endereço é um hash da chave pública, a chave bruta aparece aqui durante o gasto. Observe que as coordenadas da chave pública são strings hexadecimais que representam pontos na curva, distintas dos hashes de 20 bytes e 32 bytes usados nos endereços da versão 0 do SegWit.

Fatos-chave

  • A chave privada é um número inteiro aleatório entre 1 e n−1, onde n ≈ 1,158 × 10^77.
  • O secp256k1 é definido por y² = x³ + 7 no campo primo p = 2^256 − 2^32 − 977.
  • A multiplicação escalar k·G produz a chave pública; revertê-la (ECDLP) é computacionalmente inviável.
  • Chaves públicas não compactadas têm 65 bytes (prefixo 04); chaves compactadas têm 33 bytes (prefixo 02/03).
  • O Taproot utiliza chaves x-only de 32 bytes, omitindo completamente a coordenada y e o prefixo.
  • secp256k1 é uma curva de Koblitz com poucos parâmetros não explicados, escolhida por Satoshi em 2009.

Exercício nove, seis, três, um

9ReunirListe as 9 propriedades do secp256k1: sua equação, o primo do campo, a ordem do ponto gerador, os tamanhos das chaves (não compactadas/compactadas/somente x), o nível de segurança, a origem do padrão, o tipo de curva e dois fatos históricos sobre sua adoção.
6AgruparAgrupe os 9 em 6: equação e campo, gerador e ordem, formatos de chave, nível de segurança, histórico de padrões e adoção.
3DestilarReduza as 6 para 3 razões pelas quais o secp256k1 é adequado ao modelo de propriedade do Bitcoin.
1CristalizarEscreva uma frase indicando a operação matemática precisa que transforma um inteiro privado em um ponto público, e nomeie o problema que impede sua reversão.

Verificação de fatos

Datas, números e afirmações verificados com as fontes publicadas listadas abaixo.

Abrir na academia interativa →

EN ES ZH JA KO RU DE FR MS