Pular para conteúdo

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

  1. Algoritmo de ataque por análise de frequência decifrando textos sem chave prévia.
  2. Cálculo matemático correto da entropia de Shannon comparando CSPRNGs.
  3. Demonstração em terminal dos testes estatísticos de distribuição.