Instruções Gerais:

  • Resolva as atividades em ordem progressiva de maturidade.
  • Cada nível adiciona requisitos técnicos, tratamento de erros e casos de borda reais.
  • Consulte o gabarito comentado ao final de cada questão para autoavaliação.

🎯 Nível 1: Fundamentos

Problema 5.1 — Criptografia AES-128 em Modo CBC com PKCS#7 Padding

Contexto: Criptografia AES-128 em Modo CBC com PKCS#7 Padding no contexto de Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR).

Requisitos de Execução:

  1. Cifrar mensagem utilizando AES em modo CBC com Vetor de Inicialização (IV) aleatório de 16 bytes.

Resultado Esperado

Texto cifrado em AES-CBC com padding PKCS#7.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_5_1_SeuNome
  2. Envie na tarefa: Atividade Cap 5 - Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR)
🔑 Gabarito de Código & Solução Comentada
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
import os

def cifrar_aes_cbc(dados: bytes, chave: bytes) -> tuple[bytes, bytes]:
    iv = os.urandom(16)
    padder = padding.PKCS7(128).padder()
    dados_padded = padder.update(dados) + padder.finalize()
    cipher = Cipher(algorithms.AES(chave), modes.CBC(iv))
    encryptor = cipher.encryptor()
    cifrado = encryptor.update(dados_padded) + encryptor.finalize()
    return iv, cifrado

if __name__ == "__main__":
    k = os.urandom(16) # AES-128
    iv, c = cifrar_aes_cbc(b"Dados Bancarios Confidenciais", k)
    print(f"AES-CBC Cifrado: {c.hex()} | IV: {iv.hex()}")

🔍 Nível 2: Prática

Problema 5.2 — Decifração AES-CBC e Remoção Segura de Padding

Contexto: Decifração AES-CBC e Remoção Segura de Padding no contexto de Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR).

Requisitos de Execução:

  1. Decifrar ciphertext AES-CBC e desempacotar padding PKCS#7 tratando exceção de padding inválido.

Resultado Esperado

Dados restaurados com validação estrita de padding.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_5_2_SeuNome
  2. Envie na tarefa: Atividade Cap 5 - Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR)
🔑 Gabarito de Código & Solução Comentada
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding

def decifrar_aes_cbc(cifrado: bytes, chave: bytes, iv: bytes) -> bytes:
    cipher = Cipher(algorithms.AES(chave), modes.CBC(iv))
    decryptor = cipher.decryptor()
    dados_padded = decryptor.update(cifrado) + decryptor.finalize()
    unpadder = padding.PKCS7(128).unpadder()
    return unpadder.update(dados_padded) + unpadder.finalize()

if __name__ == "__main__":
    print("Rotina de decifracao AES-CBC homologada.")

⚡ Nível 3: Integração

Problema 5.3 — Modo de Operação AES-CTR (Counter Mode) como Cifra de Fluxo

Contexto: Modo de Operação AES-CTR (Counter Mode) como Cifra de Fluxo no contexto de Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR).

Requisitos de Execução:

  1. Cifrar fluxo de dados com AES-CTR sem necessidade de padding utilizando contador incremental (Nonce + Counter).

Resultado Esperado

AES-CTR operando como stream cipher de alta velocidade.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_5_3_SeuNome
  2. Envie na tarefa: Atividade Cap 5 - Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR)
🔑 Gabarito de Código & Solução Comentada
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
import os

def cifrar_aes_ctr(dados: bytes, chave: bytes) -> tuple[bytes, bytes]:
    nonce = os.urandom(16)
    cipher = Cipher(algorithms.AES(chave), modes.CTR(nonce))
    encryptor = cipher.encryptor()
    return nonce, encryptor.update(dados) + encryptor.finalize()

if __name__ == "__main__":
    k = os.urandom(32) # AES-256
    nonce, c = cifrar_aes_ctr(b"Stream de Video em Tempo Real", k)
    print(f"AES-CTR Cifrado: {c.hex()} (Sem padding)")

🏆 Nível 4: Desafio Corporativo

Problema 5.4 — Demonstração de Vulnerabilidade do Modo ECB (ECB Penguin)

Contexto: Demonstração de Vulnerabilidade do Modo ECB (ECB Penguin) no contexto de Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR).

Requisitos de Execução:

  1. Demonstrar como o modo ECB preserva padrões visuais ao cifrar blocos idênticos com a mesma chave.

Resultado Esperado

Insegurança do modo ECB comprovada recomendando banimento em produção.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_5_4_SeuNome
  2. Envie na tarefa: Atividade Cap 5 - Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR)
🔑 Gabarito de Código & Solução Comentada
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
import os

def demonstrar_vulnerabilidade_ecb() -> None:
    chave = os.urandom(16)
    # Dois blocos identicos de 16 bytes
    bloco = b"A" * 16
    dados = bloco + bloco
    cipher = Cipher(algorithms.AES(chave), modes.ECB())
    cifrado = cipher.encryptor().update(dados)
    # Em ECB, cifrado[:16] eh exatamente igual a cifrado[16:]
    assert cifrado[:16] == cifrado[16:]
    print("Vulnerabilidade ECB: Blocos identicos geram ciphertexts identicos!")

if __name__ == "__main__":
    demonstrar_vulnerabilidade_ecb()

⬅️ Voltar ao Índice de Exercícios 📚 Sumário de Tópicos