Criptografia Simétrica de Bloco: AES e Modos de Operação (CBC, CTR)
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:
- 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)
- Salve o arquivo como:
Atividade_5_1_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_5_2_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_5_3_SeuNome - 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:
- 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)
- Salve o arquivo como:
Atividade_5_4_SeuNome - 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 |