Pular para conteúdo

Aula 18 - Protocolos Criptográficos e Cifras de Bloco (AES-GCM) 🔒

Objetivo Pedagógico

Objetivo: Analisar as construções de cifras de bloco (SPN - Substitution-Permutation Network), modos de operação legados (ECB, CBC) e dominar a implementação de Criptografia Autenticada com Dados Adicionais (AEAD) usando AES-GCM.


📑 1. Fundamentos Teóricos & Análise Técnica

A criptografia simétrica é a ferramenta responsável pela cifragem em massa de dados em trânsito e em repouso devido à sua eficiência computacional extrema.

A evolução dos modos de operação de cifras de bloco resolveu graves deficiências históricas: 1. O Advanced Encryption Standard (AES - FIPS 197): - Cifra de bloco simétrica que processa dados em blocos fixos de 128 bits utilizando chaves de 128, 192 ou 256 bits através de rodadas consecutivas de operações matemáticas: SubBytes, ShiftRows, MixColumns e AddRoundKey. 2. A Falha Crítica dos Modos Legados: - Electronic Codebook (ECB): Cifra cada bloco de 128 bits de forma independente com a mesma chave. Padrões idênticos no texto claro geram blocos cifrados idênticos, preservando a silhueta visual dos dados (o clássico vazamento do Tux do Linux). - Cipher Block Chaining (CBC): Resolve a repetição através de encadeamento com vetor de inicialização (IV), mas requer preenchimento (Padding PKCS#7), tornando-se vulnerável a Ataques de Padding Oracle que permitem a um atacante decifrar mensagens sem conhecer a chave. 3. Authenticated Encryption with Associated Data (AEAD - AES-GCM): - O modo Galois/Counter Mode (GCM) combina o modo contador (CTR) para cifragem com multiplicação no corpo de Galois ($ ext{GF}(2^{128})$) para calcular uma Tag de Autenticação (MAC). - Qualquer adulteração de um único bit no texto cifrado ou nos dados adicionais (AAD) faz a decifragem falhar imediatamente, garantindo confidencialidade e integridade simultâneas.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    Plaintext["Texto Claro"] --> CTR["Modo Contador (AES-CTR)"]
    IV["Vetor de Inicialização (Nonce Único)"] --> CTR
    Key["Chave Secreta Simétrica (256 bits)"] --> CTR
    CTR --> Ciphertext["Texto Cifrado"]
    Ciphertext & AAD["Dados Adicionais Não Cifrados (Headers/TenantID)"] --> GHASH["Multiplicação Galois (GHASH)"]
    GHASH --> Tag["Authentication Tag (128 bits)"]
    style Plaintext fill:#e1f5fe,stroke:#01579b
    style Key fill:#ffebee,stroke:#c62828
    style Ciphertext fill:#fff3e0,stroke:#e65100
    style Tag fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Unicidade Obrigatória do Nonce: A reutilização de um mesmo Nonce com a mesma chave em AES-GCM destrói completamente a segurança do modo, permitindo a recuperação da chave de autenticação. - Authenticated Data (AAD): Permite autenticar metadados (como IDs de usuários, portas ou rotas) que devem trafegar em texto claro mas não podem ser forjados. - Aceleração por Hardware (AES-NI): Instruções nativas de processadores modernos que executam criptografia AES em taxa de múltiplos gigabytes por segundo. - Prevenção Contra Ataques de Replay: Inclusão de contadores de sequência ou timestamps dentro do envelope criptográfico autenticado.


🛠️ 2. Implementação Prática em Criptografia Simétrica e Modos de Operação Autenticados

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// aes_gcm_aead.py (Cifragem Autenticada com Validação de Integridade e Metadados)
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

def secure_encrypt_payload(key: bytes, plaintext: bytes, associated_data: bytes):
    """Cifra payload usando AES-256-GCM com proteção de integridade."""
    # 1. Nonce de 96 bits (12 bytes) gerado com entropia criptográfica segura
    nonce = os.urandom(12)
    aesgcm = AESGCM(key)

    # 2. Cifragem e geração automática da tag de autenticação de 16 bytes
    ciphertext = aesgcm.encrypt(nonce, plaintext, associated_data)
    return nonce + ciphertext

def secure_decrypt_payload(key: bytes, encrypted_blob: bytes, associated_data: bytes):
    """Decifra e valida se a integridade dos dados foi violada."""
    nonce = encrypted_blob[:12]
    ciphertext = encrypted_blob[12:]
    aesgcm = AESGCM(key)

    # Decripta e valida a tag; lança InvalidTag se adulterado!
    return aesgcm.decrypt(nonce, ciphertext, associated_data)

if __name__ == '__main__':
    chave_mestre = AESGCM.generate_key(bit_length=256)
    dado_secreto = b"Dados ultra confidenciais de cartao de credito"
    metadado_auditoria = b"tenant_id:42|operacao:pagamento"

    pacote = secure_encrypt_payload(chave_mestre, dado_secreto, metadado_auditoria)
    print(f"Pacote criptografado com sucesso ({len(pacote)} bytes)")

    recuperado = secure_decrypt_payload(chave_mestre, pacote, metadado_auditoria)
    print(f"Texto decifrado com garantia matemática de integridade: {recuperado.decode()}")

💡 Análise Passo a Passo do Código

  1. Geração do Nonce via os.urandom(12): Garante que cada pacote cifrado utilize um vetor de inicialização criptograficamente único.
  2. Associação de Metadados (associated_data): Protege dados estruturais contra adulteração mesmo sem ocultar seu conteúdo.
  3. Lançamento de Exceção InvalidTag: Impede que qualquer dado corrompido ou forjado seja entregue à camada de aplicação.

🎯 3. Próximos Passos & Sequência Didática