Esteganografia em Java Duvida

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

[code]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;
                }
            }       
        }
    }
}[/code]

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.

Quais são suas dúvidas?

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á ?

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.

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.

Curiosidade: O que é Esteganografia?

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.

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.

Perfeito! mto interessante testei aqui, ficou mto bom!

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

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

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!

[code]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 .
19/10/2010 08:38 …
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>[/code]

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:

puxa :shock:

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

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

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

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.

Tendi :slight_smile:

[]s

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!

Boa noite,

Muito bom :slight_smile:

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

[]s

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.