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
- Geração do Nonce via
os.urandom(12): Garante que cada pacote cifrado utilize um vetor de inicialização criptograficamente único. - Associação de Metadados (
associated_data): Protege dados estruturais contra adulteração mesmo sem ocultar seu conteúdo. - 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
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto