security cryptography ecc rsa encryption web-security

Guia de Curva Elíptica e Criptografia Assimétrica Avançada

Um guia abrangente sobre criptografia assimétrica moderna: comparando variantes RSA (OAEP, PSS) com Criptografia de Curva Elíptica (ECDSA, Ed25519), troca de chaves (X25519) e derivação de chaves (HKDF).

2026-04-11

Introdução à Criptografia Assimétrica

A criptografia assimétrica, ou criptografia de chave pública, é a pedra angular da segurança digital moderna. Ao contrário da criptografia simétrica, onde uma única chave é compartilhada, os sistemas assimétricos usam um par de chaves: uma chave pública para criptografia ou verificação de assinatura, e uma chave privada para descriptografia ou assinatura.

Este guia explora a evolução do RSA tradicional para a moderna Criptografia de Curva Elíptica (ECC), cobrindo padrões como Ed25519, X25519 e esquemas avançados como RSA-PSS e HKDF.


1. Variantes RSA: OAEP, PSS e PKCS1-v1.5

O RSA (Rivest–Shamir–Adleman) tem sido o padrão da indústria por décadas. No entanto, a maneira como o RSA é implementado importa significativamente para a segurança.

RSA-PKCS1-v1.5 (O Padrão Legado)

O esquema de preenchimento (padding) mais antigo. Embora ainda amplamente utilizado, é vulnerável a ataques de oráculo de preenchimento (como o ataque Bleichenbacher). Geralmente é desencorajado para novas aplicações.

RSA-OAEP (Optimal Asymmetric Encryption Padding)

Usado para criptografia. O OAEP adiciona um preenchimento baseado em rede de Feistel que fornece "consciência do texto simples". Ele evita que um invasor possa modificar o texto cifrado e obter informações sobre o texto simples.

  • Recomendação: Use RSA-OAEP em vez de PKCS1-v1.5 para criptografar dados.

RSA-PSS (Probabilistic Signature Scheme)

Usado para assinaturas digitais. Ao contrário dos esquemas mais antigos, o PSS é comprovadamente seguro no modelo de oráculo aleatório. Ele adiciona sal (salt) ao processo de assinatura, tornando-o probabilístico em vez de determinístico.

  • Recomendação: Protocolos modernos como TLS 1.3 exigem ou preferem fortemente assinaturas RSA-PSS em vez de assinaturas PKCS1-v1.5 antigas.

2. Mergulho Profundo em Criptografia de Curva Elíptica (ECC)

A ECC oferece o mesmo nível de segurança que o RSA, mas com chaves muito menores. Por exemplo, uma chave ECC de 256 bits é aproximadamente equivalente a uma chave RSA de 3072 bits.

ECDSA (Elliptic Curve Digital Signature Algorithm)

O análogo de curva elíptica do Algoritmo de Assinatura Digital (DSA).

  • ECDSA-P256: A curva NIST mais comum. Amplamente suportada, mas alguns expressam preocupações sobre possíveis "backdoors" nos parâmetros NIST.
  • ECDSA-P384: Usado para níveis de segurança mais altos (Top Secret).

EdDSA e Curvas de Edwards Torcidas

A criptografia moderna está se movendo em direção ao EdDSA (Edwards-curve Digital Signature Algorithm).

  • Ed25519: Baseado na Curve25519. Ele é projetado para alta velocidade e alta segurança. É determinístico (sem necessidade de um gerador de números aleatórios durante a assinatura), o que elimina uma fonte comum de falhas catastróficas no ECDSA.
  • Ed448: Uma curva "Goldilocks" que oferece segurança ainda maior (nível de segurança de 224 bits) do que o Ed25519.

3. Protocolos de Troca de Chaves

Como duas partes estabelecem um segredo compartilhado por um canal inseguro?

Diffie-Hellman (DH)

O protocolo de troca de chaves original. Hoje, ele é substituído principalmente por sua versão de Curva Elíptica.

ECDH (Elliptic Curve Diffie-Hellman)

  • ECDH-P256 / P384: Usando curvas NIST para estabelecer segredos.
  • X25519: O padrão ouro moderno para troca de chaves. É uma função ECDH usando a Curve25519. É mais rápida, segura e fácil de implementar corretamente do que as curvas NIST.
  • X448: A contraparte de maior segurança para o X25519.

4. Derivação de Chave: HKDF

Uma vez que um segredo compartilhado é estabelecido (por exemplo, via X25519), ele não deve ser usado diretamente como uma chave de criptografia. Em vez disso, usamos uma Função de Derivação de Chave (KDF).

HKDF-SHA256 (KDF de extração e expansão baseada em HMAC)

O HKDF segue um processo de duas etapas:

  1. Extract (Extrair): Pega o segredo compartilhado "bruto" e um sal opcional para produzir uma "chave pseudoaleatória" (PRK).
  2. Expand (Expandir): Transforma essa PRK em várias chaves de comprimentos desejados (por exemplo, uma chave AES e um IV).

O uso do HKDF-SHA256 garante que as chaves finais sejam criptograficamente fortes e independentes.


5. Tabela Comparativa

Algoritmo Tamanho da Chave (Segurança) Desempenho Padrão Caso de Uso
RSA 2048 112 bits Lento Legado Compatibilidade
RSA 3072 128 bits Muito Lento Forte Legado/Corporativo
ECDSA-P256 128 bits Rápido NIST Mobile/Web Geral
Ed25519 128 bits Muito Rápido Moderno Recomendado para Assinaturas
X25519 128 bits Muito Rápido Moderno Recomendado para Troca de Chaves
Ed448 224 bits Médio Alta Seg Sistemas ultra seguros

6. Recomendações de Segurança: Por que Ed25519?

Por que os especialistas estão se afastando do RSA e das curvas NIST para o Ed25519?

  1. Resiliência a ataques de canal lateral: As implementações do Ed25519 são frequentemente de tempo constante por design, protegendo contra ataques de tempo.
  2. Sem aleatoriedade de "má sorte": O ECDSA requer um número aleatório novo e de alta qualidade para cada assinatura. Se esse gerador (RNG) falhar um pouco, sua chave privada pode ser recuperada. O Ed25519 é determinístico e evita isso inteiramente.
  3. Desempenho: O Ed25519 é significativamente mais rápido na assinatura e verificação, o que é crítico para servidores de alto tráfego.
  4. Chaves Pequenas: Chaves de 32 bytes são muito mais fáceis de manipular em códigos QR, índices de banco de dados e cabeçalhos do que chaves RSA de 512 bytes.

7. Exemplos de Código

Node.js: Assinatura Ed25519

Usando o módulo crypto integrado:

const crypto = require('crypto');

// Gerar par de chaves Ed25519
const { privateKey, publicKey } = crypto.generateKeyPairSync('ed25519');

const mensagem = Buffer.from('Olá, Segurança!');

// Assinar
const assinatura = crypto.sign(null, mensagem, privateKey);

// Verificar
const isVerified = crypto.verify(null, message, publicKey, assinatura);
console.log('Assinatura Verificada:', isVerified);

Python: Troca de Chaves X25519

Usando a biblioteca cryptography:

from cryptography.hazmat.primitives.asymmetric import x25519

# Lado da Alice
alice_private = x25519.X25519PrivateKey.generate()
alice_public = alice_private.public_key()

# Lado do Bob
bob_private = x25519.X25519PrivateKey.generate()
bob_public = bob_private.public_key()

# Cálculo do Segredo Compartilhado
alice_shared = alice_private.exchange(bob_public)
bob_shared = bob_private.exchange(alice_public)

assert alice_shared == bob_shared
print("Segredo compartilhado estabelecido!")

8. FAQ: Armadilhas Comuns

Q: Posso usar a mesma chave para RSA-OAEP e RSA-PSS?

A: Tecnicamente possível, mas fortemente desencorajado. Usar a mesma chave para propósitos diferentes (criptografia e assinatura) pode levar a ataques entre protocolos. Sempre use chaves separadas para funções separadas.

Q: O Ed25519 é resistente à computação quântica?

A: Não. Como o RSA e todos os ECC atuais, o Ed25519 é vulnerável a computadores quânticos de larga escala usando o algoritmo de Shor. Para resistência quântica, você deve procurar por Criptografia Pós-Quântica (PQC) como ML-KEM ou ML-DSA.

Q: Por que usar SHA-256 com HKDF?

A: O SHA-256 oferece uma alta margem de segurança e é suportado globalmente. Embora o SHA-3 ou BLAKE2 sejam excelentes, o SHA-256 continua sendo o padrão da indústria para implementação de HKDF.


Resumo

A transição do RSA para a Criptografia de Curva Elíptica representa um grande salto em segurança e eficiência. Para aplicações modernas:

  • Use Ed25519 para assinaturas digitais.
  • Use X25519 para troca de chaves.
  • Use HKDF-SHA256 para derivação de chaves.
  • Só use RSA-OAEP/PSS se a compatibilidade com sistemas legados for estritamente necessária.

Ao adotar esses padrões modernos, você garante que sua aplicação seja rápida, segura e alinhada com as melhores práticas criptográficas atuais.