Olá, acabei de fazer um programinha que faz esteganografia(esconder uma mensagem secreta em um arquivo de imagem).
Ele está funcionando perfeitamente para os principais formatos de imagem, usando imagens pequenas o programa faz o processo rapidamente, porém algumas imagens grandes demora um pouco pra gravar o arquivo modificado, chegando a passar de 30 segundos pra imagens com 3 MB.
O programa funciona basicamente assim:
FileInputStream input=new FileInpitStream(arquivoDeEntrada);//arquivo que será a imagem original
FileOutputStream output=new FileOutputStream(arquivoDeSaida);
int byteImg;//irei guardar os bytes da imagem nessa variavel cada vez que percorrer o laço
while((byteImg=input.read())!=-1){
//aqui eu transformo o byteImg em uma String em formato binário(01010101)
//e entra um algoritmo que troca alguns bits desse "byte" e joga esse "byte" modificado dentro do output.
}
Gostaria de saber se é possivel trabalhar com os bits de arquivos de forma rápida mesmo com imagens grandes.
[quote=mateusviccari]Olá, acabei de fazer um programinha que faz esteganografia(esconder uma mensagem secreta em um arquivo de imagem).
Ele está funcionando perfeitamente para os principais formatos de imagem, usando imagens pequenas o programa faz o processo rapidamente, porém algumas imagens grandes demora um pouco pra gravar o arquivo modificado, chegando a passar de 30 segundos pra imagens com 3 MB.
O programa funciona basicamente assim:
FileInputStream input=new FileInpitStream(arquivoDeEntrada);//arquivo que será a imagem original
FileOutputStream output=new FileOutputStream(arquivoDeSaida);
int byteImg;//irei guardar os bytes da imagem nessa variavel cada vez que percorrer o laço
while((byteImg=input.read())!=-1){
//aqui eu transformo o byteImg em uma String em formato binário(01010101)
//e entra um algoritmo que troca alguns bits desse "byte" e joga esse "byte" modificado dentro do output.
}
Gostaria de saber se é possivel trabalhar com os bits de arquivos de forma rápida mesmo com imagens grandes.[/quote]
vc está lendo 1 byte por vez ? aí demora mesmo
Tanto o InputStream quanto o OutputStream tem métodos que te permitem ler/escrever blocos de bytes com arrays de bytes; Daí basta escolher um tamanho de array que equilibre E/S com processamento.
Argh! Não faça isso.
Pra começar, converter para string em formato binário pode ser bom para você entender ou debugar seu programa, mas na prática é perda de tempo.
Em vez disso, você deve:
a) Trabalhar com blocos de bytes, lendo-os de uma vez (em vez de um byte de cada vez - argh ugh argh)
b) Usar operações que trabalham sobre bytes, como & , ^ ou |.
Por exemplo, digamos que eu quisesse setar o bit 7 (mais significativo) do byte 240 do array de bytes “by”.
Eu usaria:
by [240] |= (1 << 7);
Para resetar o bit 0 (menos significativo) do byte 224:
by [224] &= ~ (1 << 0);
Para inverter o bit 3 do byte 126:
by [126] ^= (1 << 3);
Vou dar um exemplo de um programa que seta o bit 6 de cada byte do arquivo original.
Obviamente se você tentar fazer isso com um jpeg, vai acabar corrompendo o cabeçalho (ou seja, o arquivo vai ficar ilegível) e você não vai ter uma verdadeira estenografia.
public void setarBit6 (InputStream is, OutputStream os) throws IOException {
byte[] buffer = new byte[1024];
int nBytesLidos;
while ((nBytesLidos = is.read (buffer)) > 0) {
for (int i = 0; i < nBytesLidos; ++i) {
buffer [i] |= (1 << 6);
}
os.write (buffer, 0, nBytesLidos);
}
}
Não se esqueça, obviamente, de fechar os arquivos depois de usar essa rotina (essa rotina não fecha os arquivos).