WEB3DEV

Cover image for A magia por trás dos endereços da conta Ethereum
Fatima Lima
Fatima Lima

Posted on

A magia por trás dos endereços da conta Ethereum

Image description

A visão do Midjourney sobre o que é a Criptografia de Chave Pública.

Você já se perguntou o que torna os endereços de contas Ethereum tão singulares e aparentemente aleatórios? Nos bastidores, há um elegante e belo processo matemático que cria estes endereços. O processo não só é fascinante para entender, mas também essencial para a segurança e funcionalidade da blockchain Ethereum. Neste artigo, mergulharemos na bela matemática por trás dos endereços de contas Ethereum e exploraremos como ela funciona para garantir a integridade das transações na rede Ethereum. Quer você seja um entusiasta experiente da blockchain ou um curioso iniciante, esta exploração dos fundamentos matemáticos da Ethereum certamente irá cativar e esclarecer.

Um típico endereço da conta Ethereum parece algo assim

0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
Enter fullscreen mode Exit fullscreen mode

Tem 20 bytes de comprimento e é apresentado na notação de base16 que é caracterizada pelo prefixo 0x.

O endereço é um produto da conversão da chave pública dessa conta para um formato que é o mais adequado para o software da blockchain Ethereum. Uma chave pública pura é uma estrutura bastante volumosa e seria difícil armazená-la no banco de dados da blockchain ou usá-la em uma estrutura de transação. Pense nisso como uma forma de produzir uma chave para um mapa hash a partir de um objeto JSON com múltiplos campos.

Chave pública para o formato de endereço Ethereum

Aqui está o algoritmo desenvolvido pelos criadores do blockchain Ethereum para converter a Chave Pública em endereço.

  1. Converter a Chave Pública em uma string usando este formato:
pk_str = 04 + x-coordinate (32 bytes/64 hex) + y-coordinate (32 bytes/64 hex)
Enter fullscreen mode Exit fullscreen mode

Este formato chamado "chave pública descompactada" que é representada pelo prefixo 04 e tem este aspecto:

82972572d465d016d4c501887a8df303eee3ed602c056b1eb09260dfa0da0ab288742f4dc97d9edb6fd946babc002fdfb06f26caf117b9405ed79275763fdb1c

  1. Processar o hash desta string com o algoritmo Keccak-256 (pronuncia-se ket-sha-k). A saída será uma palavra com 32 bytes.

  2. Converter o resultado em hexadecimal de base16 .

  3. Pegar os últimos 20 bytes.

O último passo é necessário para tornar o endereço o mais compacto possível, mantendo a resistência à colisão. Alguns dizem que isso ajuda a segurança porque não seria possível derivar uma Chave Pública para fora dela, mas como qualquer pessoa pode sempre derivar a Chave Pública de uma transação assinada, duvido que ela tenha algum valor prático.

Criptografia de Chave Pública

Ok, ótimo, mas o que é Chave Pública? Como ela tem as coordenadas x e y? Para entender isto, precisaremos mergulhar na fundamentação criptográfica da blockchain.

Para começar, o que torna a blockchain Ethereum viável é a Criptografia de Chave Pública, que define uma forma de uma parte autenticar uma transação produzindo uma etiqueta de autenticação (também conhecida como assinatura) e outra parte para verificar a sua integridade sem revelar qualquer informação privada. A chave privada serve como chave de autenticação ou chave de assinatura e nunca é revelada e a chave pública atua como chave de verificação (ou chave de criptografia).

Há diferentes mecanismos de assinatura disponíveis (por exemplo, Schorr, DSA) e a que a Ethereum usa é chamada Algoritmo de Assinatura Digital de Curvas Elípticas (ECDSA), que existe há décadas sem que nenhum ataque tenha sido encontrado. Ela define 3 operações: Gerar, Assinar e Verificar.

Gerando uma chave secreta

A operação criptográfica Generate (Gerar) descreve como produzir um novo conjunto de chaves (públicas e secretas) em termos matemáticos.

A Chave Secreta é uma escolha uniforme de x do conjunto de inteiros ℤ. É definida para ter ordem q, que na Teoria dos Grupos significa simplesmente o número de elementos neste grupo.

Deve ser obtido de maneira uniforme, ou seja, de maneira devidamente aleatória. É muito importante, pois se um atacante conseguir prever um próximo número aleatório, poderá obter a Chave Secreta. ( Legal, aprendemos o primeiro vetor de ataque ao sistema de segurança Ethereum 👍🏻)

Image description

Calculando a Chave Pública

Enquanto uma Chave Secreta é apenas um Número Inteiro, uma Chave Pública é um ponto em uma curva elíptica e é definida pela fórmula pk := sk * g, onde

  • g é o ponto gerador nessa curva,
  • * é a multiplicação de curvas elípticas.

Você pode ter algumas questões em aberto neste momento, mas é aqui que está toda a magia, então pegue um chá e vamos continuar.

Curvas Elípticas e o Problema do Logaritmo Discreto

Em primeiro lugar, por que existe a necessidade da curva? Por que ela não pode ser obtida do mesmo grupo ℤ? Se tentarmos usar o número inteiro com esta fórmula, então dado sk = 11 e g = 5, calculamos pk = 55. Se você compartilhar sua pk, todos podem dividi-la por g e obter sua Chave Secreta. Esta criptografia não se mantém. Para melhorar isso, os criptógrafos começaram a usar grupos cíclicos finitos 𝔾, que possuem certas propriedades úteis. Isto viabilizou algoritmos criptográficos que impulsionam a criptografia de chaves públicas e que também possuem outros usos.

No entanto, não foi fácil desenvolver bons grupos cíclicos. As primeiras implementações, por exemplo, módulo a dos grupos multiplicativos, não foram suficientemente seguras, porque o problema do logaritmo discreto definido nesses grupos não não foi suficientemente rigoroso (segundo vetor de ataque 👻), permitindo a um atacante calcular a Chave Secreta.

Finalmente os criptógrafos foram capazes de encontrar uma solução prática em forma de curvas elípticas sobre campos finitos de primeira linha. Cada curva é definida por um conjunto de constantes cuidadosamente selecionadas que moldam a equação da curva e também definem o conjunto de números pelos quais a curva é desenhada, de modo que o problema do logaritmo discreto sobre essa curva (computação sk de pk := sk * g) seja difícil. (terceiro vetor de ataque 👻). Atualmente os criptógrafos não geram, eles mesmos as curvas, mas utilizam as curvas padrão propostas pelo NIST, como secp256r1, P256 ou secp256k1. Para calcular uma Chave Secreta, dada uma Chave Pública sobre essa curva, é preciso realizar 2^128 operações de grupo. Vou deixar que você descubra quanto tempo pode levar.

Voltando ao cálculo da Chave Pública e definindo o resto da equação, o ponto gerador em uma curva nos permite fazer operações sobre a curva. É nosso ponto de partida, se você desejar, e faz parte da definição da curva.

E por último, a multiplicação da curva elíptica significa adição de ponto gerador a ele mesmo, o que produz outro ponto na curva, por definição. Ele também é útil, por exemplo, na geração distribuída de chaves. Cada participante recebe um ponto P(i) que mais tarde pode ser combinado para obter P1 + P2 + ... + Pn = PublicKey. A operação de adição na curva elíptica requer a resolução de uma certa equação e não é simples. Há uma série de otimizações que permitem calculá-la muito rapidamente, porém o cálculo inverso leva tanto tempo que é considerado impossível.

Resumindo, enquanto uma Chave Secreta é obtida simplesmente ao acaso, há um esquema elaborado para calcular a Chave Pública a partir de uma Chave Secreta que mantém a Chave Secreta escondida. O problema do logaritmo discreto garante que este seja o caso e as curvas elípticas sobre os inteiros principais o permitem. Em seguida, a Chave Pública é convertida em uma string compacta para ser usada na blockchain.

Neste artigo eu o guiei pela superfície do vasto campo da matemática que permite a criptografia. Não discutimos as operações de Sign e Verify da ECDSA e não entramos em nenhum tópico avançado. No entanto, espero que este artigo permita que você veja a beleza por trás do tema chato dos endereços de contas das blockchains.

Image description

Esse artigo foi escrito por Oleg Kubrakov e traduzido por Fátima Lima. O original pode ser lido aqui.

Top comments (0)