Esteganografia em Java Duvida

23 respostas
brunogdealmeida

Olá, estou tentando fazer um programa de estegnografia mas estou com duvidas a respeito do codigo

public static void main(String[] args) throws IOException {
  
         String str = "Testando";
         String MARCADOR = "####";
         str += MARCADOR;
	BufferedImage img = ImageIO.read(new File("c:\teste.jpg"));
        str.getBytes();
        byte[] by = str.getBytes("ISO_8859-1");
        int posicaoString = 0;
        int b = 1;
        int desloc = 0;
        JOptionPane.showMessageDialog(null, " "+str);
        for (int j = 0, altura = img.getHeight(); j < altura; j++) {
            for (int i = 0, largura = img.getWidth(); i < largura; i++) {
                if (posicaoString < by.length) {
                    int rgb = img.getRGB(i, j); 
                    Color c = new Color(rgb); 
                    int blue = c.getBlue(), green = c.getGreen(), red = c.getRed(); 
                    byte bitMensagem = (byte) ((by[posicaoString] & b) >> desloc); 
                    byte ultimoBitPixel = (byte) (blue & 0x01); 

                    if (ultimoBitPixel == 1 && bitMensagem == 0) {
                        blue -= 1;
                    }
                    if (ultimoBitPixel == 0 && bitMensagem == 1) {
                        blue += 1;
                    }
                    c = new Color(red, green, blue);
                    img.setRGB(i, j, c.getRGB());
                    desloc++;
                    b = b << 1;
                    if (b == 256) {
                        b = 1;
                        posicaoString++;
                        desloc = 0;
                    }
                }       
            }
        }
    }

Para retirar a mensagem da foto estou usando outro programa que retira a mensagem da foto, sendo que o programa usa o mesmo método FSB. Acho que deveria passar a imagem por uma Classe BufferedImage mas não sei como.

23 Respostas

ViniGodoy

Quais são suas dúvidas?

brunogdealmeida

Tentei retirar a mensagem um algoritmo que achei na web, usa LSB tambem , mas ao retirar a mensagem parece que ele , ao inves de pegar somente a mensagem depois do marcador, ele transforma a imagem toda em bytes e imprimi na tela. Não sei se fiz algo errado ao passar a string para byte ou se é na hora de abrir a imagem.

Poderia tambem adicionar a mensagem no final da imagem, mas como faria isso, encontrar o final da imagem e escrever a mensagem lá ?

ViniGodoy

Bom, o algoritmo que vc pegou na net funciona? Você já abriu a mensagem num editor hexa para ver se ela foi corretamente codificada?

Uma dica, não tente fazer estenografia sobre formatos compactados de imagem como jpg ou gif. Esses formatos usam compactação lossy, e esse tipo de compactação permite que haja normalização de cores, o que pode eliminar completamente sua mensagem estenografada.

Se for usar algum formato, use bmp ou png, ou qualquer outro com compactação lossless.

brunogdealmeida

Sim , o outro algoritmo funciona.

A questão do formato jpeg já tinha conhecimento, também tentei com png, fiz testes com os dois varias vezes. No editor hexadecimal ainda não testei vou fazer isso agora.

Marky.Vasconcelos

Curiosidade: O que é Esteganografia?

brunogdealmeida

Uma definição basica:

Wikipedia:

Esteganografia (do grego “escrita escondida”) é o estudo e uso das técnicas para ocultar a existência de uma mensagem dentro de outra. Em outras palavras, esteganografia é o ramo particular da criptologia que consiste em fazer com que uma forma escrita seja camuflada em outra a fim de mascarar o seu verdadeiro sentido.
É importante frisar a diferença entre criptografia e esteganografia. Enquanto a primeira oculta o significado da mensagem, a segunda oculta a existência da mensagem.
Um exemplo básico de técnica moderna de esteganografia é a alteração do bit menos significativo de cada pixel de uma imagem colorida de forma a que ele corresponda a um bit da mensagem. Essa técnica, apesar de não ser ideal, pouco afeta o resultado final de visualização da imagem.

ViniGodoy

Como esse tópico não é tão antigo assim (eu até me lembrava dele), e tinha mais gente acompanhando, aqui está um exemplo:
http://www.guj.com.br/posts/list/221679.java#1134695

Escondido na logo do GUJ está os fontes do programa. :slight_smile:

Desculpem ressuscitar, mas é meio raro eu fazer exemplos completos como aquele.

hvivox

Perfeito! mto interessante testei aqui, ficou mto bom!

como faço para adicionar esse tópico como favorito??

ViniGodoy

Um pouco abaixo do botão responder tem um link escrito “adicionar à favoritos”.

gomesrod
Tentei usar esse exemplo para extrair a mensagem do logo e aconteceu uma coisa estranha. O programa extraiu os fontes do JAR e não a mensagem!
C:\temp\esteg>dir

 Pasta de C:\temp\esteg

18/10/2010  08:57             4.902 Estenografia.jar
18/10/2010  08:57             7.302 logo.png
               2 arquivo(s)        

C:\temp\esteg>java -jar Estenografia.jar -r logo.png
Lendo dados da imagem...
Descompactando arquivos...C:\temp\esteg\Estenografia.mf -> Pronto!
C:\temp\esteg\Estenografia.java -> Pronto!
Pronto!

C:\temp\esteg>dir

 Pasta de C:\temp\esteg

19/10/2010  08:38    <DIR>          .
19/10/2010  08:38    <DIR>          ..
18/10/2010  08:57             4.902 Estenografia.jar
19/10/2010  08:38             8.517 Estenografia.java
19/10/2010  08:38                81 Estenografia.mf
18/10/2010  08:57             7.302 logo.png
               4 arquivo(s)    

C:\temp\esteg>
ViniGodoy

O .jar não tem os fontes, tem o .class

O programa funcionou perfeitamente. A mensagem que estava lá dentro era mesmo os fontes. :slight_smile:

gomesrod

puxa :shock:

ViniGodoy

Tava esperando só uma frasezinha? Aquela logo poderia gardar até uns 70k de texto plano. :smiley:

KaosBr

Tava esperando só uma frasezinha? Aquela logo poderia gardar até uns 70k de texto plano. :D

Bom dia,

Muito interessante o tópico :smiley: Dei uma olhada, na imagem, ela tem 220x54, fiz uma conta aqui e deu 11880 pixels, nessa area. Como saber exatamente, quanto ela pode esteganografar, de um arquivo de texto plano?

Parabéns pelo tópico :slight_smile:

[]s

ViniGodoy

Exatamente não dá para saber, pois ele usa compactação. Os 7k do fonte, por exemplo, viraram 1k depois de compactados.

Mas cada pixel da imagem armazena meio byte. Uma imagem de 220x54 tem 11880 pixels, capazes então de armazenar 5940 - 8 bytes, pois os 8 primeiros são usados para guardar o tamanho do arquivo.

Isso dá 5k. Texto plano de código fonte geralmente é extremamente compactável. Primeiro, por usar na maior parte caracteres ascii. Segundo, por ter muita repetição.

KaosBr

Tendi :slight_smile:

[]s

ViniGodoy

Agora, veja quanto uma imagem de 640x480 poderia armazenar.
Ela tem 307.200 pixels, o que deixaria disponível uns 153.600 bytes.

153k de texto compactado! Vai dar um arquivo original de uns 500k!

KaosBr

Boa noite,

Muito bom :slight_smile:

Só por curiosidade, o tamanho do arquivo de imagem, é alterado?

[]s

ViniGodoy

Muda sim. Como cada pixel fica ligeiramente diferente do outro, a compactação não irá comprimir tanto quanto comprimiria a imagem se todos fossem iguais.

A

Parabéns pelo tópico.

Estou com dificuldades para fazer esteganografia de um texto dentro de um mp3 para trabalho de aula. Alguém sabe como fazer?

ViniGodoy

O princípio é o mesmo, limpar bits onde existe baixa percepção.

Agora, o mp3 é um formato com compactação lossy, e isso dificulta muito as coisas. Não sei nem se é mesmo possível. Teria que estudar o formato a fundo para te responder. Em um arquivo wav tenho certeza ser possível. E até fácil.

Aqui tem o exemplo com imagens:

A

Como ficaria com o arquivo wav?

Quem sabe consigo ter um rumo de pesquisa…

ViniGodoy

O wav basicamente é uma lista de potência enviadas para a caixa de som. Essas potências são amostradas numa taxa de alguns Hz.
O princípio é exatamente o mesmo do que com as imagens. Remova dois bits menos significativos de cada amostra, e substitua por seus dados.

Criado 26 de março de 2010
Ultima resposta 17 de mai. de 2011
Respostas 23
Participantes 7