Pular para conteúdo

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.pem e public_key.pem.
  • R2 (Troca de Chaves ECDH): Implementar a negociação de segredo compartilhado utilizando a curva X25519 com a biblioteca cryptography.
  • 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

  1. Demonstração da troca ECDH sem vazamento de chaves privadas.
  2. Derivação determinística de chaves simétricas com HKDF.
  3. Cifragem e decifragem de mensagens entre as duas partes virtuais.