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