Esteganografia LSB

Há muito tempo, escrevi meu primeiro post no Habré. E aquele post foi dedicado a um problema bastante interessante, a saber, a esteganografia. Claro, a solução proposta naquele antigo tópico não pode ser chamada de esteganografia no verdadeiro sentido da palavra. É apenas um jogo com formatos de arquivos, mas, mesmo assim, é um jogo interessante.

Hoje, tentaremos cavar um pouco mais fundo e estudaremos o algoritmo LSB. Se você está interessado, fique à vontade para continuar. (Abaixo, o tráfego: cerca de um megabyte.)

Antes de mais nada, é necessário fazer uma pequena introdução. Todos sabemos que o propósito da criptografia é tornar impossível a leitura de informações secretas. Obviamente, a criptografia tem seus campos de aplicação, mas há também outra abordagem para a proteção de dados. Pode-se não criptografar a informação, mas fazer parecer que não a temos. É exatamente para isso que a esteganografia foi criada. A Wikipédia nos assegura que "esteganografia (do grego στεγανοσ — oculto e γραφω — escrever, literalmente 'escrita secreta') é a ciência da transmissão oculta de informações, mantendo em segredo o próprio fato da transmissão.

Claro, ninguém proíbe a combinação de métodos criptográficos e esteganográficos. Mais ainda, na prática, assim é feito, mas nossa tarefa é entender os fundamentos. Se você estudar atentamente o artigo da Wikipédia, pode descobrir que nos algoritmos de esteganografia existem o chamado contêiner e a mensagem. O contêiner é qualquer informação que ajuda a ocultar nossa mensagem secreta.

No nosso caso, o contêiner será uma imagem no formato BMP. Primeiro, vamos examinar a estrutura desse arquivo. O arquivo pode ser, condicionalmente, dividido em 4 partes: cabeçalho do arquivo, cabeçalho da imagem, paleta e a própria imagem. Para nossos propósitos, precisamos saber apenas o que está escrito no cabeçalho.

Os dois primeiros bytes do cabeçalho são a assinatura BM, em seguida, em uma palavra dupla, está registrado o tamanho do arquivo em bytes, os próximos 4 bytes estão reservados e devem conter zeros e, finalmente, em outra palavra dupla, está registrado o deslocamento do início do arquivo até os próprios bytes da imagem. Em um arquivo BMP de 24 bits, cada pixel é codificado em três bytes BGR.

Agora sabemos como acessar a imagem, resta entender como podemos gravar as informações que precisamos nela. Para isso, o método LSB será útil. A essência do método é a seguinte: substituímos os bits mais baixos nos bytes que codificam a cor. Suponha que o próximo byte da nossa mensagem secreta seja 11001011, enquanto os bytes na imagem sejam… 11101100 01001110 01111100 0101100111…, então a codificação ficará assim. Vamos dividir o byte da mensagem secreta em 4 partes de dois bits: 11, 00, 10, 11, e substituiremos esses fragmentos pelos bits mais baixos da imagem: …11101111 01001100 01111110 0101100111…. Essa substituição, em geral, não é perceptível a olho nu. Além disso, muitos dispositivos de saída mais antigos podem não conseguir exibir tais alterações insignificantes.

É claro que é possível alterar não apenas 2 bits mais baixos, mas qualquer quantidade deles. Aqui há uma regra a seguir: quanto maior o número de bits que mudamos, maior será a quantidade de informações que podemos esconder e maiores serão as distorções na imagem original. Como exemplo, aqui estão duas imagens:

Esteganografia LSB
Esteganografia LSB

Apesar de todos os esforços, não consegui notar a diferença entre elas, no entanto, na segunda imagem, usando o método descrito, está escondido o poema de Lewis Carroll "A Caça ao Snark". Se você chegou até aqui, provavelmente está interessado em saber sobre a implementação. É bastante simples, mas aviso que tudo foi feito em Delphi. As razões para isso são duas: 1. Considero Delphi uma linguagem boa e sólida; 2. Este programa nasceu durante a preparação de um curso sobre os fundamentos da visão computacional, e os alunos a quem dou esse curso ainda não conhecem outra coisa além de Delphi. Para aqueles que não estão familiarizados com a sintaxe, é importante esclarecer uma coisa: shl x – deslocamento de bits para a esquerda por x, shr x – deslocamento de bits para a direita por x.

Suponha que estamos gravando um texto em um contêiner, armazenado em uma string, e substituímos os dois bits mais baixos:
Código para gravação:

for i:=1 to length(str) do
    begin
      l1:=byte(str[i]) shr 6;
      l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
      l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
      l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    end;

Código para leitura:

for i:=1 to MsgSize do
    begin
      f.ReadBuffer(tmp,1);
      l1:=tmp shl 6;
      f.ReadBuffer(tmp,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      f.ReadBuffer(tmp,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      f.ReadBuffer(tmp,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      str:=str+char(l1+l2+l3+l4);
    end;

E para aqueles que são realmente preguiçosos – link para o programa e seu código fonte.

Obrigado.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster