Projeto 03: Análise Criptográfica de Cifras Clássicas e Entropia 🔐
Escopo do Projeto
Objetivo: Implementar e analisar a quebra criptográfica de cifras clássicas de substituição (Cifra de César e Vigenère) utilizando análise de frequência de caracteres e calcular a entropia de Shannon de geradores de números pseudoaleatórios.
🎯 1. Contexto & Desafio Prático
Para compreender a robustez dos algoritmos criptográficos modernos, é essencial dominar os princípios matemáticos que causaram o colapso dos sistemas históricos. Você construirá uma ferramenta em Python que decifra textos cifrados com Vigenère sem conhecer a chave e analisa a qualidade de entropia de chaves geradas.
📋 2. Requisitos Técnicos Obrigatórios
- R1 (Implementação de Cifras Históricas): Implementar codificadores e decodificadores para Cifra de César e Cifra de Vigenère em Python puro.
- R2 (Criptoanálise por Frequência): Construir algoritmo de ataque que analisa a frequência de letras na língua portuguesa para deduzir a chave de César e o tamanho da chave de Vigenère (Método Kasiski).
- R3 (Cálculo da Entropia de Shannon): Calcular numericamente a entropia de Shannon (\(H = -\sum p_i \log_2 p_i\)) de geradores inseguros (
random.random) vs geradores criptográficos (secrets.token_bytes). - R4 (Relatório Criptoanalítico): Demonstrar o texto original recuperado a partir de um texto cifrado misterioso fornecido.
📐 3. Diagrama Conceitual & Arquitetura
graph TD
Ciphertext["Texto Cifrado (Vigenère)"] --> Freq["Análise de Frequência de Caracteres"]
Freq --> Kasiski["Exame Kasiski: Dedução do Comprimento da Chave"]
Kasiski --> Decrypt["Decifração Automática por Chi-Square"]
Decrypt --> Plaintext["Texto Claro Original Recuperado!"]
style Ciphertext fill:#ffebee,stroke:#c62828
style Freq fill:#fff3e0,stroke:#e65100
style Kasiski fill:#f3e5f5,stroke:#7b1fa2
style Plaintext fill:#e8f5e9,stroke:#2e7d32 💻 4. Especificação Técnica & Código de Referência
// shannon_entropy.py
import math
from collections import Counter
import secrets
import random
def shannon_entropy(data: bytes) -> float:
"""Calcula a entropia de Shannon em bits por byte (máximo 8.0)."""
if not data:
return 0.0
counts = Counter(data)
total = len(data)
entropy = 0.0
for count in counts.values():
p = count / total
entropy -= p * math.log2(p)
return entropy
if __name__ == '__main__':
# Chave gerada com baixa entropia (previsível)
low_entropy = bytes([random.randint(65, 90) for _ in range(1000)])
# Chave gerada com CSPRNG de alta entropia
high_entropy = secrets.token_bytes(1000)
print(f"Entropia Baixa (random): {shannon_entropy(low_entropy):.3f} bits/byte")
print(f"Entropia Alta (secrets): {shannon_entropy(high_entropy):.3f} bits/byte (Ideal ~8.0)")
📦 5. Critérios de Avaliação e Entrega
- Algoritmo de ataque por análise de frequência decifrando textos sem chave prévia.
- Cálculo matemático correto da entropia de Shannon comparando CSPRNGs.
- Demonstração em terminal dos testes estatísticos de distribuição.