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:
- Extract (Extrair): Pega o segredo compartilhado "bruto" e um sal opcional para produzir uma "chave pseudoaleatória" (PRK).
- 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?
- 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.
- 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.
- Desempenho: O Ed25519 é significativamente mais rápido na assinatura e verificação, o que é crítico para servidores de alto tráfego.
- 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.