Logo UFPR Logo Licenciatura em Computação

CÓDIGO DA DISCIPLINA: DEE345

SEGURANÇA DIGITAL - Aula 8

Professor Jéfer Benedett Dörr

Prof. Jéfer Benedett Dörr

Departamento de Engenharias e Exatas - UFPR/Palotina

Docente de Segurança da Informação

Aula 8: Criptografia II – Assimétrica e Certificados Digitais

Objetivos de Aprendizagem

1. Criptografia Assimétrica

1.1 Par de Chaves

Cada entidade possui uma chave privada (sigilosa) e uma chave pública (distribuída). A segurança baseia-se na dificuldade de inverter certas operações matemáticas, segurança robusta, conforme LGPD e PNSI.

A chave pública cifra ou verifica; a privada decifra ou assina.

1.2 RSA

Algoritmo clássico baseado na fatoração de grandes primos.

Exemplos & Comandos


# Gerar par RSA-4096
openssl genpkey -algorithm RSA -out rsa_priv.pem -pkeyopt rsa_keygen_bits:4096

# Extrair pública
openssl rsa -pubout -in rsa_priv.pem -out rsa_pub.pem

# Inspecionar par de chaves
openssl pkey -in rsa_priv.pem -text -noout

# Cifrar / Decifrar
openssl pkeyutl -encrypt -pubin   -inkey rsa_pub.pem  -in msg.txt -out msg.rsa
openssl pkeyutl -decrypt           -inkey rsa_priv.pem -in msg.rsa -out msg.dec
  

Notícia: Em 2009, a fatoração de RSA-768 (232 dígitos) levou meses de cálculo em super-computadores¹.

A Fatoração do RSA-768: Um Marco na Criptografia

Em 2009, um esforço colaborativo internacional alcançou um feito notável na história da segurança digital: a fatoração do RSA-768, um número de 232 dígitos. Este evento demonstrou de forma prática a evolução do poder computacional e a necessidade de adotar chaves criptográficas cada vez mais fortes.

O Desafio

O RSA-768 era um número semi-primo (produto de dois números primos grandes) da "RSA Factoring Challenge", uma competição criada para testar os limites da segurança do algoritmo RSA. Quebrar a chave significava encontrar esses dois fatores primos.

O Esforço Computacional

A fatoração levou cerca de dois anos para ser concluída por uma equipe de pesquisadores de diversas instituições. O poder de processamento necessário foi equivalente a aproximadamente 2000 anos de cálculo em um único núcleo de processador, distribuído entre centenas de máquinas.

A Implicação para a Segurança

O sucesso da fatoração provou que chaves RSA de 768 bits não eram mais seguras para proteger informações importantes a longo prazo. Isso acelerou a migração da indústria para chaves mais fortes, consolidando o RSA de 2048 bits como o novo padrão mínimo de segurança para aplicações como sites HTTPS.

1.3 ECC (Elliptic Curve Cryptography)

Oferece segurança equivalente a RSA com chaves muito menores — ideal para IoT e dispositivos limitados.

Exemplos & Comandos


# Gerar chave ECC na curva prime256v1
openssl ecparam -name prime256v1 -genkey -noout -out ecc_priv.pem

# Extrair pública
openssl ec -in ecc_priv.pem -pubout -out ecc_pub.pem

# Inspecionar curva e parâmetros
openssl ecparam -in ecc_priv.pem -text -noout

  

Comparação: ECC-256 bits ≈ RSA-3072 bits em segurança².

Ferramentas

Nota: O ataque ao Banco do Brasil (2023) explorou RSA-1024, mitigável com ECC-256.

Prática: Gere chaves RSA e ECC com PuTTYgen e compare com OpenSSL. Publique uma chave pública via Keybase.

2. Acordo de Chaves Diffie-Hellman

Permite derivar um segredo compartilhado sem transmitir diretamente a chave, essencial para TLS e VPNs.

Exemplos & Comandos


# Gerar parâmetros DH
openssl dhparam -out dhparam.pem 2048

# Cada parte gera sua chave
openssl genpkey -paramfile dhparam.pem -out dh1.pem
openssl genpkey -paramfile dhparam.pem -out dh2.pem

# Extrair públicas
openssl pkey -in dh1.pem -pubout -out dh1_pub.pem
openssl pkey -in dh2.pem -pubout -out dh2_pub.pem

# Derivar segredo
openssl pkeyutl -derive -inkey dh1.pem -peerkey dh2_pub.pem -out secret1.bin
openssl pkeyutl -derive -inkey dh2.pem -peerkey dh1_pub.pem -out secret2.bin
# secret1.bin == secret2.bin
  

Aplicação prática em TLS: ECDHE em HTTPS usa variações baseadas em curvas elípticas.

Ferramentas

Prática: Capture uma sessão HTTPS com Wireshark e analise ECDHE. Simule DH em Cryptool com chaves pequenas.

🔍 Análise HTTPS e Diffie-Hellman

Wireshark + ECDHE + CrypTool

🦈 Parte 1: Captura HTTPS com Wireshark

1. Preparação do Wireshark

Passo 1: Iniciar captura
  • Abra o Wireshark como administrador
  • Selecione interface de rede ativa
  • Clique em "Start capturing packets"
Passo 2: Filtrar tráfego HTTPS
ssl or tls or port 443

Aplicar este filtro na barra de filtros do Wireshark

2. Gerar tráfego HTTPS

Passo 3: Acessar site HTTPS
  • Abra navegador e visite: https://www.google.com
  • Ou qualquer site HTTPS de sua escolha
  • Aguarde carregamento completo

3. Análise do Handshake TLS

Passo 4: Localizar mensagens TLS
  • Client Hello: Busque por "Client Hello"
  • Server Hello: Encontre "Server Hello"
  • Key Exchange: Procure "Server Key Exchange"

🔑 Analisando ECDHE no Wireshark:

  1. Expanda o pacote "Server Key Exchange"
  2. Procure por "EC Diffie-Hellman Server Params"
  3. Observe os campos:
    • Curve Type: named_curve
    • Named Curve: secp256r1, secp384r1, etc.
    • Public Key: Chave pública do servidor

📊 Campos importantes para análise:

Campo Descrição Exemplo
Cipher Suite Algoritmo de criptografia escolhido TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Named Curve Curva elíptica utilizada secp256r1 (P-256)
Public Key Length Tamanho da chave pública 65 bytes (para P-256)

🧮 Parte 2: Simulação DH no CrypTool

1. Acessar CrypTool Online

Passo 1: Abrir ferramenta
  • Acesse: https://www.cryptool.org/en/cto/
  • Ou baixe CrypTool 2.0 para desktop
  • Navegue até: Procedures → Key Exchange → Diffie-Hellman

2. Configurar parâmetros pequenos

Passo 2: Definir valores para demonstração
  • Primo p: 23 (número primo pequeno)
  • Gerador g: 5 (gerador do grupo)
  • Chave privada Alice (a): 6
  • Chave privada Bob (b): 15

3. Execução passo a passo

Passo 3: Calcular chaves públicas
Alice calcula: A = g^a mod p = 5^6 mod 23 = 8
Bob calcula:   B = g^b mod p = 5^15 mod 23 = 19
Passo 4: Trocar chaves públicas
  • Alice envia A = 8 para Bob
  • Bob envia B = 19 para Alice
Passo 5: Calcular segredo compartilhado
Alice calcula: s = B^a mod p = 19^6 mod 23 = 2
Bob calcula:   s = A^b mod p = 8^15 mod 23 = 2

Segredo compartilhado: 2

⚠️ Vulnerabilidade com números pequenos:

  • Força bruta: Com p=23, há apenas 22 possibilidades
  • Logaritmo discreto: Fácil de resolver manualmente
  • Interceptação: Atacante pode descobrir chaves privadas

🔬 Parte 3: Análise Comparativa

ECDHE vs DH Clássico:

Aspecto ECDHE (Produção) DH (Demonstração)
Tamanho da chave 256-384 bits 23 (5 bits)
Segurança Muito alta Nenhuma
Tempo para quebrar Impossível atualmente Segundos
Perfect Forward Secrecy Sim Sim (conceito)

Comandos úteis para análise:

# Verificar certificado SSL de um site
openssl s_client -connect google.com:443 -servername google.com

# Listar cipher suites suportados
nmap --script ssl-enum-ciphers -p 443 google.com

# Verificar curvas elípticas suportadas
openssl s_client -connect google.com:443 -curves secp256r1

📝 Resumo da Prática

✅ O que você aprendeu:

  • Wireshark: Como capturar e analisar handshake TLS/HTTPS
  • ECDHE: Identificar parâmetros de curvas elípticas em uso real
  • DH Clássico: Simular troca de chaves com números pequenos
  • Segurança: Diferença entre parâmetros seguros e inseguros
🎯 Principais observações:
  • HTTPS moderno usa ECDHE com curvas de 256+ bits
  • Números pequenos tornam DH completamente inseguro
  • Perfect Forward Secrecy protege comunicações passadas
  • Wireshark permite análise detalhada do processo de handshake

3. Certificados Digitais X.509

Certificados X.509 garantem identidade e segurança, conforme MP 2.200-2/2001.

3.1 Conceitos & Cadência de Confiança

3.2 Gerar CSR e Assinar Self-Signed


# Gerar chave privada
openssl genpkey -algorithm RSA -out user_priv.pem -pkeyopt rsa_keygen_bits:2048

# Criar CSR (Certificate Signing Request)
openssl req -new -key user_priv.pem -out user.csr \
  -subj "/C=BR/ST=PR/L=Palotina/O=UFPR/OU=TI/CN=usuario.ufpr"

# Autoassinar CSR (vencimento: 365 dias)
openssl x509 -req -in user.csr -signkey user_priv.pem \
  -out user_cert.pem -days 365
  

3.3 Inspeção e Validação


# Ver detalhes do certificado
openssl x509 -in user_cert.pem -noout -text

# Verificar fingerprint SHA256
openssl x509 -in user_cert.pem -noout -fingerprint -sha256

# Conectar e inspecionar cert de um site
openssl s_client -connect example.com:443 -showcerts
  

Ferramentas

4. Prática SSH com Chaves Públicas

Autenticação SSH com chaves elimina senhas, aumentando segurança.

4.1 Geração de Par SSH


# RSA 4096 bits
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "seu.email@ufpr.br"

# Ed25519 (recomendada)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "seu.email@ufpr.br"
  

4.2 Distribuição & Conexão


# Copiar automaticamente
ssh-copy-id -i ~/.ssh/id_rsa.pub usuario@servidor

# Copiar manualmente
cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# Permissões corretas
ssh usuario@servidor "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

# Configurar servidor
ssh usuario@servidor "echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config && sudo systemctl restart sshd"

# Testar
ssh usuario@servidor

# Conectar definindo a chave
ssh -i ~/.ssh/id_ed25519 usuario@servidor
  

Notícia prática: grandes data centers (Google, GitHub) migraram para Ed25519 em 2020 por performance³.

4.2 Chave física: YubiKey

O YubiKey é um dispositivo de autenticação física desenvolvido pela Yubico que funciona como uma chave de segurança para proteger contas, sistemas e serviços contra acesso não autorizado. Ele é usado para: Autenticação de dois fatores (2FA); Login sem senha (SSH, GPG, etc.); ou Armazenamento seguro de chaves criptográficas.

Prática: Configure SSH com chaves Ed25519 entre duas VMs, usando troca manual e ssh-copy-id. Integre uma chave com YubiKey e teste autenticação.

Guia SSH Ed25519 + YubiKey

1. Gerar par de chaves Ed25519

ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C "seu_email@exemplo.com"

2. Copiar chave pública para VM remota

ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@vm_remota

3. Configurar YubiKey (OPCIONAL)

  1. Instalar ferramentas: sudo apt install yubikey-manager scdaemon
  2. Gerar chave na YubiKey: ssh-keygen -t ed25519-sk -C "yubikey_chave"
  3. Copiar chave: ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub usuario@vm_remota

4. Testar conexão

ssh -i ~/.ssh/id_ed25519 usuario@vm_remota
# Para YubiKey:
ssh -i ~/.ssh/id_ed25519_sk usuario@vm_remota

Dicas de Segurança

5. GnuPG (PGP) – Assinaturas e Criptografia de E-mail

GPG protege e-mails e arquivos com criptografia e assinaturas.


# Instalar (Debian/Ubuntu)
sudo apt install gnupg

# Gerar chave GPG
gpg --full-generate-key

# Exportar pública
gpg --armor --export seu.email@ufpr.br > pubkey.asc

# Importar
gpg --import pubkey.asc

# Criptografar arquivo
gpg --encrypt --recipient seu.email@ufpr.br mensagem.txt

# Assinar arquivo
gpg --sign mensagem.txt

# Verificar assinatura
gpg --verify mensagem.txt.gpg
  

Aplicação real: PGP/GPG ainda usado em e-mail corporativo e em repositórios de código (ex.: Git tag signing).

Ferramentas

Nota: O vazamentosde dados:

Prática: Configure Thunderbird com Enigmail para enviar e-mails criptografados. Troque chaves GPG entre alunos e verifique assinaturas.

Configuração de E-mail Criptografado com Thunderbird e Enigmail

1. Instalação

  1. Instale o Thunderbird: sudo apt install thunderbird (Linux) ou baixe em thunderbird.net
  2. Adicione o complemento Enigmail através do menu de extensões do Thunderbird
  3. Instale o GnuPG: sudo apt install gnupg

2. Configuração Inicial

  1. Abra o Thunderbird e vá em Enigmail > Assistente de configuração
  2. Selecione "Configurar automaticamente"
  3. Crie um novo par de chaves ou importe uma existente

3. Troca de Chaves entre Alunos

  1. Exporte sua chave pública: gpg --export -a "seu@email.com" > minha_chave_publica.asc
  2. Compartilhe o arquivo .asc com seus colegas
  3. Importe chaves recebidas: gpg --import chave_colega.asc
  4. Verifique a autenticidade das chaves pessoalmente (comparando fingerprints)

4. Enviando E-mails Criptografados

  1. Componha um novo e-mail no Thunderbird
  2. No menu Enigmail, selecione "Criptografar" e/ou "Assinar"
  3. Envie normalmente - o e-mail será criptografado automaticamente

5. Verificando Assinaturas

  1. E-mails assinados mostrarão um ícone de verificação no Thunderbird
  2. Para verificar manualmente: gpg --verify arquivo_assinado.asc
  3. Certifique-se que a assinatura é de uma chave confiável em seu anel de chaves

Quiz de Avaliação – Aula 8

1. Qual comando OpenSSL gera um par de chaves RSA de 4096 bits?

2. Qual curva foi usada para gerar a chave ECC no exemplo?

3. Após executar o acordo Diffie-Hellman, o que acontece com secret1.bin e secret2.bin?

4. Em um certificado X.509, qual campo indica quem emitiu o certificado?

5. Qual comando cria um CSR (Certificate Signing Request) a partir de uma chave privada em OpenSSL?

6. Para inspecionar detalhes de um certificado remoto via TLS, usamos qual comando?

7. Qual comando copia a chave pública SSH para o servidor de destino de forma automática?

8. Qual comando GnuPG cifra um arquivo para um destinatário específico?