Cripto-esteganografia: imagens inocentes podem transportar arquivos secretos

Há muito tempo se discute como armazenar ou transmitir informações confidenciais de forma segura. Essa questão é fundamental nos dias de hoje, sobretudo com a Internet servindo de meio de comunicação para os diversos fins. Recentemente, diversos casos recentes de quebra de privacidade colocaram o tema no centro das atenções. Esteganografia [3, 5] consiste no uso de técnicas para se ocultar uma mensagem dentro de outra, que funcionará como veı́culo. Este trabalho mostra não apenas como podemos guardar uma informação qualquer dentro de uma imagem, mas também como podemos deixá-la protegida através de criptografia. Alguns trabalhos correlatos foram publicados [1, 4]. Nosso método, no entanto, é original e de simples implementação, podendo ser utilizado tanto para uso pessoal quanto para a troca de mensagens e arquivos entre duas partes através de uma rede insegura. O primeiro desafio para se realizar a esteganografia criptografada (ou cripto-estenografia) é como esconder qualquer tipo de arquivo dentro de uma imagem, seja ele texto puro, áudio, imagem ou até mesmo vı́deo. Evidentemente, qualquer arquivo pode ser convertido em um vetor de bytes. Essa é a propriedade fundamental que permitirá o método. Tendo em mãos, portanto, um vetor de bytes, podemos quebrá-lo ainda mais em um bit array, isto é, em um vetor composto unicamente por valores 0 e 1. Não diferenciaremos, a princı́pio, qual o tipo ou extensão do arquivo secreto; apenas o converteremos para um grande vetor binário. Utilizaremos um padrão qualquer de t bits — por exemplo, “111111”, com t = 6 — para identificar o fim do arquivo. Vamos chamá-lo de terminador. Para evitar que a existência, no conteúdo do arquivo original, de um padrão de bits idêntico ao terminador seja confundida com uma indicação de fim de arquivo, utilizamos a técnica de bit stuffing: para cada subsequência idêntica aos t−1 bits mais significativos do terminador, insere-se um bit que é o complemento do bit menos significativo do terminador. Isto é, cada ocorrência de “11111” no vetor de bits original se transformará em “111110”. Esse último bit, sendo 0’, será descartado durante a leitura; sendo ‘1’, será interpretado como o último bit de um terminador, e então estará sinalizada a situação de fim do arquivo. Além disso, para que o arquivo possa ser de fato recuperado, a extensão do arquivo (que indica seu tipo) precisa ser também armazenada e recuperada. Para isso, essa informação é codificada também em binário e colocada no inı́cio do vetor de bits, separada do conteúdo do arquivo por um terminador. Nosso segundo problema é como esconder esse vetor binário em uma imagem de forma que seja impossı́vel recuperar os dados sem uma senha especı́fica. Para isso utilizaremos uma senha privada, acordada entre as partes comunicantes, que servirá de seed para um gerador de números pseudo-aleatórios. É sabido que um tal gerador, quando alimentado com determinada seed, produzirá na verdade uma sequência infinita (e determinı́stica! ) de valores. O gerador de números paseudo-aleatórios será então utilizado para definir, de antemão, um arranjo aleatório de n pixels da imagem, onde n é a quantidade de bits do arquivo a ser escondido. Um tal arranjo pode ser obtido em tempo O(n) por uma execução