Esteganografia é a prática de esconder uma mensagem de modo que ninguém suspeite que ela existe. A criptografia embaralha uma mensagem para que ela não possa ser lida; a esteganografia a coloca dentro de algo comum, como uma foto de férias ou um áudio de voz, para que ninguém pense em procurar. A palavra vem do grego e significa "escrita coberta".

A esteganografia digital trata sobretudo de imagens, porque uma foto guarda milhões de números que podem ser mexidos sem que ninguém veja diferença. Este guia explica os métodos que realmente existem, de mudar o último bit de um pixel a trabalhar dentro da compressão JPEG, por que a maioria dos truques de "arquivo escondido dentro de uma foto" é algo mais simples do que a esteganografia de verdade, por que enviar uma foto por um aplicativo de mensagem muitas vezes apaga a parte escondida e o que fazem as pessoas que procuram dados escondidos, chamadas de esteganalistas.

O que é esteganografia

Todo sistema esteganográfico tem as mesmas três partes. A carga (payload) é o segredo: uma mensagem, um arquivo, uma pasta. O portador (carrier), também chamado de capa, é o arquivo inocente que a guarda: um PNG, um JPEG, uma gravação WAV. O resultado, o portador com a carga dentro, chama-se arquivo estego ou pacote. O artigo da Wikipédia sobre o tema acrescenta um quarto termo útil, a densidade de codificação: a fração do portador que foi alterada. Quanto menor a densidade, mais difícil de notar a alteração e menos dados cabem.

A vantagem sobre a criptografia, nas palavras da Wikipédia, é que o segredo "does not attract attention to itself as an object of scrutiny" (não atrai atenção para si como objeto de escrutínio). Um arquivo criptografado anuncia que algo está sendo protegido. A foto de um cachorro não anuncia nada. Essa também é a fraqueza: quando alguém passa a suspeitar da foto, a esteganografia sozinha não protege nada, e por isso as ferramentas sérias criptografam a carga primeiro e a escondem depois. Esconder compra obscuridade. A criptografia é o que mantém o conteúdo seguro quando a obscuridade falha.

A ideia é 2.500 anos mais velha que o computador

As histórias mais antigas são físicas. Heródoto descreve uma mensagem tatuada na cabeça raspada de um mensageiro, enviado depois que o cabelo cresceu de novo. Séculos depois, usaram-se tintas invisíveis que aparecem com o calor e, no século XX, micropontos reduziram uma página de texto ao tamanho de um ponto final impresso. A própria palavra aparece pela primeira vez em 1499, na Steganographia de Johannes Trithemius, um tratado de criptografia e esteganografia disfarçado de livro de magia.

A versão digital mantém a mesma lógica e troca o couro cabeludo por um formato de arquivo. Um portador só precisa de duas propriedades: alguma parte dele pode mudar sem que um humano note, e um programa que sabe onde olhar consegue ler a mudança de volta. As imagens têm as duas em abundância.

A esteganografia LSB muda o último bit de cada cor

O método de livro didático é a inserção no bit menos significativo (LSB, least significant bit). Um pixel em uma imagem típica guarda vermelho, verde e azul como números de 0 a 255, cada um escrito em oito bits. O último bit vale exatamente um degrau. Inverta-o e um valor de vermelho 200 vira 201. Nenhuma tela e nenhum olho conseguem mostrar essa diferença.

Um pixel com vermelho 200, verde 117 e azul 54 mostrado em binário. Substituir o último bit de cada valor pelos bits da mensagem 1, 0, 1 dá 201, 116 e 55. As duas amostras de cor parecem idênticas.
Três bits de mensagem guardados em um pixel. Cada valor se move no máximo um degrau em 255.

Repita isso em todos os valores da imagem e a capacidade soma. Uma foto de 12 megapixels tem 36 milhões de valores de cor, então um bit cada dá 36 milhões de bits, cerca de 4,5 MB na teoria. As ferramentas reais usam muito menos, tanto para ficarem discretas quanto porque espalham os bits em uma ordem pseudoaleatória derivada de uma senha, de modo que a carga não fique em um bloco arrumado no topo da imagem.

O LSB só funciona em formatos sem perdas, como PNG e BMP, onde cada valor de pixel é guardado exatamente. Salve a mesma imagem como JPEG e o compressor arredonda os valores, embaralhando os últimos bits e a mensagem junto.

Também é o método que os esteganalistas entendem melhor. Fotos naturais têm um padrão de ruído característico nos bits baixos, e sobrescrever esses bits com dados criptografados, que parecem perfeitamente aleatórios, muda o padrão. Westfeld e Pfitzmann publicaram um ataque estatístico à inserção LSB em 2000, e Fridrich, Goljan e Du mostraram em 2001 que, em imagens coloridas, a inserção aumenta o número de pares de cores "muito próximas". A Wikipédia informa que alterações só de LSB podem ser detectadas "in some cases detecting encoding densities as low as 1% with reasonable reliability" (em alguns casos detectando densidades de codificação de até 1% com confiabilidade razoável), embora esse número não tenha referência lá. No Hacker News, um comentarista foi mais direto: o ruído introduzido pela substituição LSB ingênua é "VERY easy to detect" (MUITO fácil de detectar).

A esteganografia em JPEG trabalha dentro da compressão

A maioria das fotos em celulares e na web são JPEGs, então as ferramentas tiveram que achar um jeito de sobreviver ao arredondamento do JPEG. A resposta é esconder os dados depois do arredondamento em vez de antes.

Um codificador JPEG corta a imagem em blocos de 8 por 8 pixels e converte cada bloco em 64 coeficientes de frequência com uma transformada chamada transformada discreta de cosseno (DCT): um número para o brilho médio do bloco, outros para detalhes grosseiros e finos. Depois divide esses coeficientes por uma tabela de qualidade e os arredonda, e é aí que acontece a perda. A esteganografia em JPEG edita os próprios coeficientes arredondados, então nada que o codificador faça depois arredonda a mensagem para fora.

As primeiras ferramentas faziam isso de forma ingênua. JSteg e JPHide, dois dos programas que Provos e Honeyman testaram em 2001, mudam os bits baixos dos coeficientes de maneiras que deslocam o histograma geral deles, e testes estatísticos pegam isso. O OutGuess, escrito por Niels Provos em 1999, insere bits em coeficientes pseudoaleatórios e depois ajusta outros para que o histograma global corresponda ao original, justamente para derrotar o ataque qui-quadrado.

Não durou: um ataque de 2002 de Fridrich, Goljan e Hogea mediu a "blockiness" (aspecto de blocos) nas bordas dos blocos JPEG e quebrou o OutGuess, estimando até o tamanho da mensagem escondida. O steghide, a ferramenta de linha de comando mais conhecida, segue outro caminho para JPEG e áudio: troca pares de valores escolhidos com a senha, para que as contagens de cada cor ou amostra continuem as mesmas, o que os autores descrevem como resistente a "first-order statistical tests" (testes estatísticos de primeira ordem).

Essa corrida armamentista ainda é a forma do campo. Fridrich, Pevny e Kodovsky chamaram a esteganografia JPEG estatisticamente indetectável de um problema de pesquisa cheio de "dead ends" (becos sem saída) em 2007, e em 2012 a esteganálise já tinha passado para classificadores de aprendizado de máquina treinados com milhares de características de imagem. As duas afirmações que um leitor encontra na internet, que a esteganografia é "fácil de detectar" e que é "difícil de detectar", são verdadeiras. A linha divisória é o algoritmo, não a ideia.

A maioria dos "arquivos escondidos em uma foto" é dado anexado, não esteganografia de verdade

Procure no YouTube como esconder um arquivo dentro de uma imagem e a demonstração mais comum não é LSB. É um comando de uma linha no Windows:

  1. Coloque uma foto e um arquivo zip na mesma pasta.
  2. Execute copy /b photo.jpg + archive.zip combined.jpg no Prompt de Comando. No macOS ou no Linux, cat photo.jpg archive.zip > combined.jpg faz o mesmo.
  3. Abra combined.jpg: ele mostra a foto. Renomeie para .zip e muitas ferramentas de arquivo compactado abrem os arquivos.

Isso funciona por causa de como os formatos terminam. Um JPEG termina com um marcador de fim de imagem e um PNG com um bloco chamado IEND, que a especificação do PNG define como "the last chunk in a PNG datastream" (o último bloco em um fluxo de dados PNG). Os visualizadores de imagem param de ler ali e ignoram qualquer coisa depois. Os leitores de zip, ao contrário, procuram o diretório do arquivo compactado no fim do arquivo e trabalham de trás para frente. Um arquivo que dois programas diferentes leem como válido chama-se polyglot, e o "velho truque do RAR", como o chamou um usuário do Reddit em r/Steganography, é o exemplo mais comum.

Diagrama de três formas de esconder dados em um arquivo: mudar os bits baixos dos pixels dentro dos dados da imagem, anexar bytes depois do marcador de fim e adicionar registros extras que o formato permite antes do marcador de fim.
Três lugares onde dados escondidos podem ficar. Só o primeiro muda a própria imagem.

Uma terceira família fica entre as duas. A maioria dos formatos são contêineres de blocos rotulados e definem um jeito de adicionar blocos personalizados: o PNG tem blocos auxiliares, o JPEG tem segmentos de aplicação, o MP4 tem caixas definidas pelo usuário, o PDF permite comentários. Um visualizador que não reconhece um bloco o pula, então o arquivo continua totalmente válido e abre normalmente em qualquer lugar. A capacidade é grande, gigabytes em um vídeo, e nada na imagem muda.

Nenhuma dessas duas últimas é esteganografia no sentido estrito, porque nenhuma toca os pixels nem tenta parecer estatisticamente normal. O arquivo simplesmente carrega mais do que a imagem precisa. A postagem mais votada em uma amostra recente de r/Steganography escondia dados nos bytes de preenchimento das linhas de varredura de um BMP, e os próprios comentaristas apontaram os indícios: um fez as contas da capacidade, outro disse que ficaria "immediately suspicious if someone sent me an image that's not png or jpg" (imediatamente desconfiado se alguém me enviasse uma imagem que não fosse png ou jpg). Dados anexados e inseridos se escondem de uma pessoa olhando a imagem. Não se escondem de um programa que lê o arquivo inteiro, e o arquivo fica visivelmente maior do que uma foto comum do mesmo tamanho.

Compartilhar uma foto muitas vezes destrói a carga

Dados escondidos só sobrevivem se os bytes exatos sobreviverem, e muitas das formas como as pessoas compartilham fotos não os mantêm.

Quando um aplicativo de mensagem, rede social ou hospedagem de imagens recebe uma foto, muitas vezes ele não guarda o arquivo que você enviou. Ele decodifica a imagem em pixels, frequentemente a redimensiona e grava um arquivo compactado totalmente novo para economizar banda. Os bits LSB nos pixels são embaralhados pela nova compressão. Cargas em nível de coeficiente JPEG são arredondadas para fora quando a qualidade muda. Bytes anexados e registros extras de formato geralmente não são copiados, porque o app grava o novo arquivo só a partir dos pixels.

Fluxograma: uma imagem com dados escondidos que é copiada como arquivo por pen drive, drive na nuvem, anexo de e-mail ou envio como documento chega sem alteração e os dados sobrevivem. Enviada como foto, o app decodifica, redimensiona e grava um arquivo novo, então os bits dos pixels são embaralhados e os bytes e registros extras nunca são gravados.
A parte escondida só viaja quando o arquivo é copiado byte a byte.

Não há um teste público sólido de quais apps fazem isso hoje, e o comportamento muda entre versões e entre os modos de envio como "foto" e como "documento", então trate qualquer compartilhamento como com perdas até prova em contrário. As anedotas apontam todas para o mesmo lado. Um usuário do Reddit em r/Steganography descobriu que a carga de uma ferramenta só sobreviveu no download PNG do Reddit, não na versão WebP que o Reddit serve. Um comentarista do Hacker News lembrou uma tentativa anterior em que "most image hosts were smart enough to detect the sub-optimal encoding and 'helpfully' fix it" (a maioria das hospedagens de imagem era esperta o bastante para detectar a codificação subótima e "prestativamente" corrigi-la). O hábito seguro é simples: envie o arquivo como arquivo e confira se a cópia que chegou ainda abre antes de apagar o original.

A esteganálise é a arte de encontrar dados escondidos

A Wikipédia define esteganálise como "the study of detecting messages hidden using steganography" (o estudo de detectar mensagens escondidas com esteganografia), a contrapartida da criptoanálise. Os objetivos dela vêm em três passos: identificar arquivos suspeitos, decidir se carregam uma carga e recuperá-la, se possível. Os dois primeiros são estatística e inspeção de arquivos. O terceiro geralmente precisa da senha, e por isso a criptografia importa mesmo depois de a camuflagem ter sido vista.

O estudo de campo mais conhecido mostra como o terceiro passo é difícil na prática. Em 2001, Niels Provos e Peter Honeyman examinaram dois milhões de imagens de leilões do eBay. O detector deles sinalizou cerca de 17.000, e um ataque de dicionário a elas não encontrou nenhuma mensagem escondida. O artigo da Wikipédia avisa que agir só com base em esteganálise é "a very dicey proposition unless a payload has been completely recovered and decrypted" (uma proposição muito arriscada a menos que uma carga tenha sido totalmente recuperada e descriptografada), porque, do contrário, o analista tem apenas "a statistic indicating that a file may have been modified" (uma estatística indicando que um arquivo pode ter sido modificado). A história completa de como é a detecção, e dos limites dela, está em fotos ocultas podem ser detectadas. As ferramentas dos dois lados, com as idades e os pontos fracos, são comparadas em ferramentas de esteganografia.

Como o HideFile pode ajudar

A maioria das pessoas que procura esteganografia não precisa de um canal secreto. Quer que algumas fotos ou arquivos privados deixem de ser óbvios em um celular ou notebook que outras pessoas pegam. Para essa tarefa, as ferramentas clássicas são desajeitadas: o steghide guarda cargas pequenas em JPEG e WAV, as ferramentas LSB precisam de PNG e nenhuma delas dá uma galeria que você possa navegar.

O HideFile segue a terceira abordagem do diagrama acima. Em hidefile.app, em qualquer navegador moderno, você escolhe uma foto, vídeo ou PDF comum como capa, adiciona os seus arquivos privados e define uma senha. O HideFile criptografa os arquivos no navegador e os guarda como registros que o formato de arquivo permite, de modo que a capa continua abrindo como imagem, vídeo ou documento normal em qualquer outro lugar. Abra em hidefile.app com a senha e os arquivos aparecem. Nada é enviado para um servidor do HideFile, e não há nada para instalar.

É camuflagem mais criptografia, e é honesto sobre qual parte faz o trabalho. O HideFile não altera pixels nem tenta enganar testes estatísticos. Uma ferramenta feita para isso consegue perceber que foram adicionados dados à capa; o que ela não consegue é ler o conteúdo sem a senha. Isso o torna adequado para manter coisas longe de quem navega pelos seus aparelhos, e a ferramenta errada para um perito treinado, uma revista na fronteira ou pressão judicial.

Não há recuperação de senha, e apps que recodificam fotos podem apagar a parte escondida, então guarde e compartilhe a capa como arquivo. Para o panorama completo do que diferentes truques de esconder enganam, veja como esconder arquivos à vista de todos e, para comparar aplicativos de cofre de fotos, cofre de fotos é seguro?.

Fontes