Projeto 05: Criptografia Assimétrica: RSA e Diffie-Hellman 🔑
Escopo do Projeto
Objetivo: Implementar esquemas de chave pública: geração de pares de chaves RSA de 4096 bits em formato PEM, cifragem híbrida e o algoritmo de troca de chaves Diffie-Hellman sobre Curvas Elípticas (ECDH).
🎯 1. Contexto & Desafio Prático
A distribuição segura de chaves é o maior desafio em canais abertos da Internet. Você construirá uma aplicação de mensagens seguras ponto a ponto (P2P) que utiliza troca de chaves Diffie-Hellman efêmera para derivar uma chave simétrica de sessão compartilhada sem nunca trafegar a chave pela rede.
📋 2. Requisitos Técnicos Obrigatórios
- R1 (Geração de Chaves RSA e PEM): Gerar pares de chaves RSA de 4096 bits protegidas por passphrase e salvas nos formatos
private_key.pemepublic_key.pem. - R2 (Troca de Chaves ECDH): Implementar a negociação de segredo compartilhado utilizando a curva
X25519com a bibliotecacryptography. - R3 (Derivação de Chave de Sessão - HKDF): Aplicar a função de derivação de chaves baseada em HMAC (HKDF) sobre o segredo para gerar a chave simétrica de aplicação.
- R4 (Cifragem Híbrida): Cifrar o payload de mensagem com AES-GCM utilizando a chave derivada da troca assimétrica.
📐 3. Diagrama Conceitual & Arquitetura
sequenceDiagram
autonumber
participant Alice as Alice (X25519)
participant Canal as Canal Aberto Inseguro
participant Bob as Bob (X25519)
Alice->>Bob: Alice Envia Chave Pública Pública_A
Bob->>Alice: Bob Envia Chave Pública Pública_B
Note over Alice: Calcula Segredo: S = Priv_A * Pub_B
Note over Bob: Calcula Segredo: S = Priv_B * Pub_A
Note over Alice,Bob: Segredo Compartilhado S é Idêntico em Ambos!
Alice->>Alice: Deriva Chave de Sessão via HKDF
Alice->>Canal: Mensagem Cifrada com AES-GCM (Chave Derivada)
Canal->>Bob: Entrega Mensagem Cifrada
Bob->>Bob: Decifra Mensagem com Garantia Matemática! 💻 4. Especificação Técnica & Código de Referência
// ecdh_key_exchange.py
from cryptography.hazmat.primitives.asymmetric import x25519
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
# 1. Cada participante gera seu par de chaves efêmero
alice_priv = x25519.X25519PrivateKey.generate()
alice_pub = alice_priv.public_key()
bob_priv = x25519.X25519PrivateKey.generate()
bob_pub = bob_priv.public_key()
# 2. Troca de chaves e cálculo do segredo compartilhado
alice_shared = alice_priv.exchange(bob_pub)
bob_shared = bob_priv.exchange(alice_pub)
assert alice_shared == bob_shared
# 3. Derivação de Chave Simétrica (HKDF)
hkdf = HKDF(algorithm=hashes.SHA256(), length=32, salt=None, info=b"p2p-session-key")
session_key = hkdf.derive(alice_shared)
print(f"Chave de Sessão de 256 bits derivada com sucesso: {session_key.hex()[:16]}...")
📦 5. Critérios de Avaliação e Entrega
- Demonstração da troca ECDH sem vazamento de chaves privadas.
- Derivação determinística de chaves simétricas com HKDF.
- Cifragem e decifragem de mensagens entre as duas partes virtuais.