Chaves Públicas
O que é uma chave pública?
Uma chave pública é a contraparte de uma chave privada.
E, parecido com uma chave privada, ela é exibida como uma string hexadecimal.
Por exemplo:
03e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b3390
Se não encurtássemos essa chave pública em um endereço, este seria o "número de conta" para o qual você envia bitcoins ao fazer uma transação.
Enfim, aqui está a parte interessante: sua chave pública é calculada a partir da sua chave privada.
Como você obtém uma chave pública a partir de uma chave privada?
Você insere uma chave privada em uma função matemática especial, e o resultado é uma chave pública.
Que função é essa?
Ela se chama multiplicação de curva elíptica.
Isso basicamente envolve "ricochetear" pelo gráfico de uma curva elíptica até você chegar a um conjunto final de coordenadas no gráfico, e essas coordenadas resultantes são a sua chave pública.
Vai ser mais fácil se eu te mostrar...
Como é uma curva elíptica?
Assim:
Além disso, a curva elíptica usada no Bitcoin vem com um ponto de partida específico.

Chamamos esse ponto de partida de ponto gerador (G).
E se fôssemos fazer alguma "multiplicação" nessa curva (ex.: "multiplicar" o ponto de partida por 2), nos moveríamos pela curva assim.

O fato de podermos traçar uma tangente em qualquer lugar da curva e ela cruzar um outro ponto da curva é uma característica especial das curvas elípticas.
E aí está. Acabamos de "multiplicar" a coordenada de partida G por 2 e encontramos a posição da coordenada final 2G.
Esta é uma rodada de multiplicação de curva elíptica.
Multiplicação de curva elíptica
Eu fico colocando "multiplicação" entre aspas porque a multiplicação em curvas elípticas não é a multiplicação padrão. Por exemplo, se você multiplicasse as coordenadas de G por 2, isso não te daria as coordenadas de 2G (como mostrado no gráfico).
Veja bem, os gênios que descobriram que dá para se mover pela curva dessa forma específica tinham que chamar aquilo de algo, então decidiram se referir a essa operação como "multiplicação". Porque, sabe, a matemática nunca pode ser confusa o suficiente.
Então, quando eu disser "multiplicação" de agora em diante, quero dizer "multiplicação de curva elíptica".
Como você cria uma chave pública?
No exemplo acima, multiplicamos G por 2 para obter 2G.
Para obter uma chave pública, multiplicamos G pela nossa chave privada.
chave privada = b7ed7443c993af9937d9c869398bf4ed5f9523129e25dfb77ce4767fba405014
chave privada = 83192796475211405656707086712046461363785842576052176596271883290902735638548
chave pública = 83192796475211405656707086712046461363785842576052176596271883290902735638548 * G
EC Multiply
Ou, em outras palavras, "ricocheteie pela curva elíptica um número de vezes igual à chave privada".
O ponto final de descanso na curva elíptica te dará um conjunto de coordenadas, e essas coordenadas formam a chave pública.
Então, se estas são as coordenadas a que chegamos após multiplicar G pela nossa chave privada:
x = 105034410509315626961767289640948690310492512927262445783804994734160408687504
y = 5516217054127125049495563880590479521608770728790951769271312566909207073125
Então tudo o que temos que fazer é converter ambas para hexadecimal e juntá-las...
chave pública (x) = e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b3390
chave pública (y) = 0c32117641c797f724e7435bc574cfc5f04aa560394af1efec8772f1a0505165
chave pública (x,y) = e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b33900c32117641c797f724e7435bc574cfc5f04aa560394af1efec8772f1a0505165
Chave Pública
E pronto! Uma chave pública!
Formato da chave pública
Este é o formato antigo (longo) de chave pública, o que significa que eu tenho que colocar um 04 no início. Assim:
chave pública = 04e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b33900c32117641c797f724e7435bc574cfc5f04aa560394af1efec8772f1a0505165
Para descobrir por que isso acontece, infelizmente você vai ter que ler a seção sobre chaves públicas comprimidas.
Chaves Públicas Comprimidas
Para economizar espaço, as chaves públicas (hoje em dia) usam apenas a coordenada x completa.
Isso porque a curva elíptica é uma equação (y² = x³ + 7), o que significa que, se você tem a coordenada x, consegue calcular a coordenada y correspondente.
Porém, devido à parte y² da equação, o y pode ser um número positivo ou negativo:
Então a única informação extra de que você precisa para encontrar a coordenada y correta é saber se ela está acima ou abaixo do eixo x. E devido à forma como as curvas elípticas funcionam:
- Se
yfor par, está acima do eixo x. - Se
yfor ímpar, está abaixo do eixo x.
Então, em vez de ter que armazenar tanto a coordenada x quanto a y completas, você pode armazenar só a coordenada x completa e se a coordenada y é par ou ímpar.
No Bitcoin, a polaridade da coordenada y é representada por um prefixo:
02= par03= ímpar
Então, enquanto uma chave pública não comprimida à moda antiga começa com 04, uma chave pública comprimida começa com 02 ou 03:
chave pública (não comprimida) = 04e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b33900c32117641c797f724e7435bc574cfc5f04aa560394af1efec8772f1a0505165
chave pública (comprimida) = 03e8375e9ef326c8e5b3f7c7366edc07a45939a6f48559614a1e18d644838b3390
Bem mais curta.
Isso parece muito esforço para economizar uma pequena quantidade de dados, mas, como as chaves públicas são usadas em quase todas as transações, isso acaba economizando muito espaço na blockchain ao longo do tempo.
Por que usamos multiplicação de curva elíptica para criar chaves públicas?
Porque as curvas elípticas têm duas propriedades úteis ao criar um par de chaves privada/pública.
- A multiplicação de curva elíptica é uma "função alçapão" (trapdoor). Em outras palavras, você não consegue voltar da chave pública para descobrir qual era a chave privada.
Uma função alçapão é uma função fácil de calcular em uma direção, mas difícil de calcular na direção oposta (encontrar sua inversa) sem uma informação especial, chamada de "alçapão".
-
A chave pública tem uma conexão matemática com a chave privada. Como resultado, é possível provar essa conexão (com um pouco mais de matemática) sem ter que revelar sua chave privada.
Então, se eu te der minha chave pública (ou endereço), posso provar a você que a "possuo" sem ter que te mostrar minha chave privada.
Esse recurso é especialmente útil ao fazer transações de bitcoin. Sua chave pública pode ser colocada em uma transação quando você quer receber bitcoins, e você não precisa revelar a chave privada diretamente quando quer gastá-los depois (veja assinaturas digitais). Como resultado, isso significa que ninguém pode adquirir a chave privada e usá-la para gastar bitcoins que foram travados à mesma chave pública.
Quando digo provar que possuo uma chave pública, quero dizer "mostrar que possuo a chave privada a partir da qual a chave pública foi criada".
Como você pode provar que possui uma chave pública?
Este é um tópico (ou dois) inteiro por si só. Mas, como esta é uma pergunta tão irritantemente relevante, vou fazer o meu melhor para cobrir o básico.
Como mencionado, há uma conexão matemática entre a chave privada e a chave pública.
Como resultado:
- Posso passar minha chave privada por mais alguma matemática de curva elíptica para obter um novo valor (chamado de assinatura digital).
- Posso passar minha chave pública por outra matemática de curva elíptica para obter um novo valor.
Agora, haverá uma pequena sobreposição entre esses novos valores:
E essa sobreposição é suficiente para provar que há uma conexão matemática entre a chave pública e a chave privada.
E como ninguém consegue recriar essa assinatura digital sem a chave privada, minha assinatura digital é suficiente para provar que eu "possuo" a chave pública.
Como resultado, posso te mostrar que possuo uma chave pública com uma assinatura digital, e você nunca precisa ver minha chave privada.
Conclusão
Salve a curva elíptica.