CÓDIGO DA DISCIPLINA: DEE345
Departamento de Engenharias e Exatas - UFPR/Palotina
Docente de Segurança da Informação
steghide
.openssl
nos modos ECB, CBC, CTR e GCM, e observar falhas de autenticação em modos autenticados.O Banco Inter esteve envolvido em dois casos de segurança de grande repercussão. É importante distinguir um do outro, pois foram de naturezas diferentes: um foi um vazamento de dados em massa e o outro uma falha de exposição de informações.
O que aconteceu: Este foi o incidente mais grave. Em maio de 2018, veio a público que um hacker obteve acesso a um grande volume de dados de clientes, incluindo informações pessoais, senhas, fotos de documentos e dados de cartões. O invasor tentou extorquir o banco e, com a recusa, vazou os dados.
Causa: A investigação apontou para um acesso não autorizado aos sistemas do banco, possivelmente facilitado por uma falha de segurança interna.
Consequência: O Ministério Público do Distrito Federal e Territórios (MPDFT) abriu uma ação civil pública. O caso foi encerrado com um acordo de R$ 1,5 milhão, que foi destinado a instituições de caridade e órgãos de combate a crimes cibernéticos.
O que aconteceu: Em fevereiro de 2019, foi descoberta uma falha de segurança no sistema do banco, e não um vazamento em massa como o anterior. Ao realizar uma transferência para outra conta do Inter, o sistema exibia o nome completo, o CPF e o e-mail do destinatário antes de a transação ser confirmada.
Causa: Foi uma falha de programação na interface de transferência, que expunha mais dados do que o necessário.
Consequência: A vulnerabilidade criava um risco para golpes de phishing direcionados, pois um fraudador poderia obter dados de um cliente apenas sabendo o número de sua conta. O banco corrigiu a falha após ser notificado pela imprensa. Não gerou multa, mas serviu de alerta sobre a importância da privacidade por padrão (privacy by design).
Arte de ocultar mensagens ou arquivos dentro de outro arquivo, sem alterar visivelmente sua aparência.
steghide embed -cf cover.jpg -ef secret.txt -p senha
para embutir dados. steghide.sourceforge.netopenstego embed -mf secret.txt -cf cover.png -p senha -o output.png
. openstego.comoutguess -k "senha" -d secret.txt cover.jpg output.jpg
. outguess.orgsteghide
# Embutir secret.txt em cover.jpg
steghide embed -cf cover.jpg -ef secret.txt
# Extrair secret.txt de cover.jpg
steghide extract -sf cover.jpg
# Inspecionar metadados EXIF (exiftool)
sudo apt install libimage-exiftool-perl
exiftool cover.jpg
Prática: Baixe um JPG de exemplo e um TXT pequeno; use steghide
para esconder e depois recuperar.
Prática: Use OpenStego para ocultar um texto em uma imagem PNG e extraia com Steghide. Compare resultados com OutGuess e discuta resistência a análises.
Função matemática que gera uma “impressão digital” (digest) de tamanho fixo a partir de dados de qualquer tamanho.
# MD5
echo -n "senha123" | md5sum
# SHA-1
echo -n "senha123" | sha1sum
# SHA-256
echo -n "senha123" | sha256sum
# Criar e verificar checksum de arquivo
sha256sum arquivo.iso > checksum.txt
sha256sum -c checksum.txt
SHAttered foi o nome dado ao primeiro ataque de colisão bem-sucedido e público contra o algoritmo de hash SHA-1 (um "primo" mais seguro do MD5), realizado pelo Google e pelo CWI Amsterdam em 2017.
Eles conseguiram criar dois arquivos PDF completamente diferentes que, quando analisados pelo algoritmo SHA-1, geravam a mesma impressão digital (hash).
Baixe dois PDFs “shAttered” (https://shattered.io/) e confirme a mesma saída MD5:
md5sum shattered-1.pdf shattered-2.pdf
Experimento: Baixe dois PDFs com a mesma colisão MD5 (ex.: disponíveis em shAttered.io) e confirme com md5sum
.
“A segurança de um cifrador deve residir unicamente no segredo da chave, não no segredo do algoritmo.”
Algoritmos públicos com espaço de chaves tão grande que torna inviável tentativa exaustiva (ex.: AES com chaves de 128/192/256 bits).
sage -c "print(ZZ.random_element(2^128))"
. sagemath.orgÚnico cifrador matematicamente inquebrável se a chave for:
# Gerar pad aleatório
dd if=/dev/urandom of=pad.bin bs=1024 count=1
# Cifrar com XOR
python3 -c "with open('msg.txt', 'rb') as m, open('pad.bin', 'rb') as p: print([a^b for a,b in zip(m.read(), p.read())])" > cipher.bin
# Gerar pad aleatório
dd if=/dev/urandom bs=1 count=64 of=pad.bin
# Converter mensagem para binário
xxd -p mensagem.txt > msg.hex
# XOR byte a byte
paste <(xxd -p pad.bin) msg.hex | \
awk '{printf "%02x", strtonum("0x"$1) ^ strtonum("0x"$2)}' > cipher.hex
# Para decifrar
paste <(xxd -p pad.bin) cipher.hex | \
awk '{printf "%02x", strtonum("0x"$1) ^ strtonum("0x"$2)}' | \
xxd -r -p > mensagem_restored.txt
Exemplo de geração de pad aleatório e cifragem com XOR (em Linux):
head -c 1024 /dev/urandom > pad.bin
xxd -p mensagem.txt > message.hex
xxd -p pad.bin > pad.hex
# XOR byte a byte
paste -d' ' pad.hex message.hex | \
awk '{printf "%02x", strtonum("0x"$1) ^ strtonum("0x"$2)}' > cipher.hex
Prática: Use Cryptool para simular uma Cifra de César e quebre-a com análise de frequência. Implemente um One-Time Pad em SageMath.
Mesma chave para cifrar e decifrar. É rápida e adequada para grandes volumes de dados, mas requer compartilhamento seguro da chave.
Padrão atual, suporta chaves de 128, 192 e 256 bits.
GCM oferece autenticação, enquanto ECB é inseguro. Teste falhas com openssl
.
# AES-256-CBC
openssl enc -aes-256-cbc -salt \
-in segredo.txt -out segredo.enc \
-pass pass:"MinhaCh@ve123"
# AES-256-GCM (autenticado)
openssl enc -aes-256-gcm -salt \
-in segredo.txt -out segredo_gcm.enc \
-pass pass:"MinhaCh@ve123"
# Descriptografar CBC
openssl enc -d -aes-256-cbc \
-in segredo.enc -out dec.txt \
-pass pass:"MinhaCh@ve123"
# Descriptografar GCM
openssl enc -d -aes-256-gcm \
-in segredo_gcm.enc -out dec_gcm.txt \
-pass pass:"MinhaCh@ve123"
Prática: Cifre um arquivo em GCM, altere bytes do ciphertext e observe falha de autenticação ao decifrar.
Prática: Criptografe um arquivo com openssl
em AES-256-GCM e modifique o ciphertext para observar falhas. Implemente AES-CBC com PyCryptodome em Python.
OpenSSL AES-256-GCM e Python AES-CBC
echo "Dados confidenciais para teste" > arquivo.txt
openssl enc -aes-256-gcm -in arquivo.txt -out arquivo.enc -k minhasenha
cp arquivo.enc arquivo_backup.enc
# Modificar alguns bytes do arquivo criptografado echo "dados_corrompidos" >> arquivo.enc
openssl enc -d -aes-256-gcm -in arquivo.enc -out arquivo_desc.txt -k minhasenha
pip install pycryptodome
from Crypto.Cipher import AES from Crypto.Random import get_random_bytes from Crypto.Util.Padding import pad, unpad import base64 class AESCipher: def __init__(self, key): # Garante que a chave tenha 32 bytes (256 bits) self.key = key.ljust(32)[:32].encode('utf-8') def encrypt(self, plaintext): """Criptografa texto usando AES-CBC""" # Gera IV aleatório de 16 bytes iv = get_random_bytes(16) # Cria cipher em modo CBC cipher = AES.new(self.key, AES.MODE_CBC, iv) # Aplica padding PKCS7 e criptografa padded_text = pad(plaintext.encode('utf-8'), AES.block_size) ciphertext = cipher.encrypt(padded_text) # Combina IV + ciphertext e codifica em base64 encrypted_data = base64.b64encode(iv + ciphertext) return encrypted_data.decode('utf-8') def decrypt(self, encrypted_data): """Descriptografa texto usando AES-CBC""" try: # Decodifica de base64 encrypted_bytes = base64.b64decode(encrypted_data) # Separa IV (primeiros 16 bytes) do ciphertext iv = encrypted_bytes[:16] ciphertext = encrypted_bytes[16:] # Cria cipher em modo CBC cipher = AES.new(self.key, AES.MODE_CBC, iv) # Descriptografa e remove padding padded_plaintext = cipher.decrypt(ciphertext) plaintext = unpad(padded_plaintext, AES.block_size) return plaintext.decode('utf-8') except Exception as e: return f"Erro na descriptografia: {str(e)}" # Exemplo de uso if __name__ == "__main__": # Inicializa o cipher com uma chave cipher = AESCipher("minha_chave_secreta_123") # Texto a ser criptografado texto_original = "Este é um texto confidencial para teste!" print(f"Texto original: {texto_original}") # Criptografar texto_criptografado = cipher.encrypt(texto_original) print(f"Texto criptografado: {texto_criptografado}") # Descriptografar texto_descriptografado = cipher.decrypt(texto_criptografado) print(f"Texto descriptografado: {texto_descriptografado}") # Teste com dados corrompidos print("\n--- Teste com dados corrompidos ---") dados_corrompidos = texto_criptografado[:-5] + "XXXXX" resultado_corrompido = cipher.decrypt(dados_corrompidos) print(f"Resultado com corrupção: {resultado_corrompido}")
def encrypt_file(file_path, key, output_path): """Criptografa um arquivo usando AES-CBC""" cipher_obj = AESCipher(key) # Lê o arquivo with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # Criptografa o conteúdo encrypted_content = cipher_obj.encrypt(content) # Salva arquivo criptografado with open(output_path, 'w') as f: f.write(encrypted_content) print(f"Arquivo criptografado salvo em: {output_path}") def decrypt_file(encrypted_file_path, key, output_path): """Descriptografa um arquivo usando AES-CBC""" cipher_obj = AESCipher(key) # Lê arquivo criptografado with open(encrypted_file_path, 'r') as f: encrypted_content = f.read() # Descriptografa decrypted_content = cipher_obj.decrypt(encrypted_content) # Salva arquivo descriptografado with open(output_path, 'w', encoding='utf-8') as f: f.write(decrypted_content) print(f"Arquivo descriptografado salvo em: {output_path}") # Exemplo de uso com arquivos encrypt_file('documento.txt', 'minha_chave', 'documento_enc.txt') decrypt_file('documento_enc.txt', 'minha_chave', 'documento_dec.txt')
openssl
# Criptografar com AES-256-CBC
openssl enc -aes-256-cbc -salt -in segredo.txt -out segredo.enc -pass pass:"MinhaCh@ve123"
# Descriptografar
openssl enc -d -aes-256-cbc -in segredo.enc -out segredo-decrypted.txt -pass pass:"MinhaCh@ve123"
# Gerar IV aleatório e visualizar em hex
openssl rand -hex 16
# OpenSSL AES-256-GCM
openssl enc -aes-256-gcm -salt -in segredo.txt -out segredo.enc -pass pass:"MinhaCh@ve123"
# GnuPG AES-256
gpg --symmetric --cipher-algo AES256 segredo.txt
# PyCryptodome AES-GCM
python3 -c "from Crypto.Cipher import AES; from Crypto.Random import get_random_bytes; key=get_random_bytes(32); nonce=get_random_bytes(12); cipher=AES.new(key, AES.MODE_GCM, nonce=nonce); ciphertext, tag=cipher.encrypt_and_digest(b'segredo'); print(ciphertext, tag)"
Prática: Crie um arquivo de texto, cifre com AES-256-GCM (use openssl enc -aes-256-gcm
) e experimente modificar bytes do ciphertext para observar falha de autenticação no decrypt.
AES-256-GCM (Galois/Counter Mode) é um modo de operação que fornece:
Qualquer modificação no ciphertext ou tag invalida a decifragem.
echo "Dado sensível que precisa ser protegido 12345" > documento_original.txt
Verifique o conteúdo: cat documento_original.txt
Chave AES-256 (32 bytes):
openssl rand -hex 32 > chave.aes
Nonce (12 bytes para GCM):
openssl rand -hex 12 > nonce.aes
Visualize os valores gerados:
echo "Chave: $(cat chave.aes)"
echo "Nonce: $(cat nonce.aes)"
openssl enc -aes-256-gcm \
-in documento_original.txt \
-out documento_cifrado.bin \
-K $(cat chave.aes) \
-iv $(cat nonce.aes) \
-a
Parâmetros importantes:
-aes-256-gcm
: Algoritmo e modo de operação-K
: Chave hexadecimal (32 bytes)-iv
: Nonce hexadecimal (12 bytes)-a
: Saída em Base64 (opcional, facilita visualização)A. Versão Base64 (modificação manual):
cat documento_cifrado.bin | base64 --decode > documento_cifrado.raw
hexdump -C documento_cifrado.raw
B. Alterar byte(s) com dd:
printf '\xAA' | dd of=documento_cifrado.raw bs=1 seek=10 count=1 conv=notrunc
C. Converter de volta para Base64:
cat documento_cifrado.raw | base64 > documento_corrompido.bin
openssl enc -d -aes-256-gcm \
-in documento_corrompido.bin \
-out documento_decifrado.txt \
-K $(cat chave.aes) \
-iv $(cat nonce.aes) \
-a
Saída esperada:
bad decrypt
140736581377600:error:1C800064:Provider routines::bad decrypt:../providers/implementations/ciphers/cipher_gcm.c:921:
O GCM detecta a modificação devido à falha na autenticação.
A falha ocorre porque:
Compare com CBC: Modificações em AES-CBC não são detectadas, apenas causam "lixo" na saída.
+-------------------+ +---------------+ +-------------------+ | Arquivo Original | ----> | Cifragem GCM | ----> | Ciphertext Válido | +-------------------+ +---------------+ +-------------------+ | v +-------------------+ +---------------+ +-------------------+ | Decifragem Falha | <-----| Modificação | <----- | Ciphertext | +-------------------+ | Maliciosa | | Corrompido | +---------------+ +-------------------+
Teste 1: Modificar apenas a tag GCM (últimos 16 bytes):
dd if=/dev/random of=documento_cifrado.raw bs=1 seek=$(($(stat -c%s documento_cifrado.raw)-16)) count=16 conv=notrunc
Teste 2: Usar nonce incorreto:
openssl rand -hex 12 > nonce_errado.aes
openssl enc -d -aes-256-gcm [...] -iv $(cat nonce_errado.aes)
# Crunch: tamanho 6-8 usando letras e números
crunch 6 8 abcdefghijklmnopqrstuvwxyz0123456789 -o wordlist.txt
# John the Ripper
john --wordlist=wordlist.txt hashes.txt
# Hydra (FTP)
hydra -l usuario -P wordlist.txt ftp://192.168.1.20
Esses comandos devem ser usados em ambiente controlado e autorizado.
-n
evita o newline, e sha256sum
gera o hash SHA-256.
echo -n "teste" | sha256sum
, não md5sum ou sha1sum.
steghide
é usado para embutir e extrair dados de imagens sem alterar visivelmente o arquivo.
steghide
, não gpg, openssl ou john.