Criptografia de Imagens

5 respostas
S

Galera o meu problema é seguinte:
Estou querendo pegar uma imagem criptografa-la ,depois com a chave q foi usada,descriptogra-la,ai sim poder visualiza-la.Mas ta dando erro,a imagem fica destorcida,não completa na verdade,acho q se perde os dados de-la.

Classe que uso para Criptografar

import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class hjEncrypt {
    public static void main(String args[]) {
        try {
            KeyGenerator kg = KeyGenerator.getInstance("DES");
            kg.init(new SecureRandom());
            SecretKey key = kg.generateKey();
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            Class spec = Class.forName("javax.crypto.spec.DESKeySpec");
            DESKeySpec ks = (DESKeySpec) skf.getKeySpec(key, spec);
            ObjectOutputStream oos = new ObjectOutputStream(
                        new FileOutputStream("keyfile"));
            oos.writeObject(ks.getKey());

            Cipher c = Cipher.getInstance("DES/CFB8/NoPadding");
            c.init(Cipher.ENCRYPT_MODE, key);
            CipherOutputStream cos = new CipherOutputStream(new FileOutputStream("Imagem.cripto"), c);
            //FileOutputStream saida=new FileOutputStream("TripleDES2.class");
            FileInputStream arq = new FileInputStream ("eu23.png"); 
   			//DataInputStream in   = new DataInputStream (arq);
            int size=arq.available();
            byte[] ler=new byte[size];
            arq.read(ler,0,size);
            //DataOutputStream pw = new DataOutputStream(cos);
            //DataOutputStream pw = new DataOutputStream(cos);
            cos.write(ler,0,size);
            //saida.write(ler,0,size);
           //saida.close();
            //pw.write("Vinicius Alves das Neves".getBytes(),0,);
            cos.close();
            
            /*            
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(cos));
            pw.println("Vinicius Alves das Neves");
            pw.close();
            */
            oos.writeObject(c.getIV());
            oos.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
-------------------------------------------------------------------------------------


Classe q uso para descriptografar
-------------------------------------------------------------------------------------


import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class hjDecrypt {
    public static void main(String args[]) {
        try {
            ObjectInputStream ois = new ObjectInputStream(
                        new FileInputStream("keyfile"));
            DESKeySpec ks = new DESKeySpec((byte[]) ois.readObject());
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            SecretKey key = skf.generateSecret(ks);

            Cipher c = Cipher.getInstance("DES/CFB8/NoPadding");
            c.init(Cipher.DECRYPT_MODE, key, 
                   new IvParameterSpec((byte[]) ois.readObject()));
                   
            FileInputStream classeCripto=new FileInputStream("Imagem.cripto");       
            CipherInputStream cis = new CipherInputStream(classeCripto, c);
            
            FileOutputStream arq = new FileOutputStream ("eu232.png");  
            	           
            DataInputStream pw = new DataInputStream(cis); 
                       
            int tam=classeCripto.available();
            byte[] ler=new byte[tam];
            cis.read(ler,0,tam);
            arq.write(ler,0,tam);
           
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

Alguem pode me ajudar?Grato!

5 Respostas

O
sdbmcc:
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class hjEncrypt {
    public static void main(String args[]) {
        try {
            KeyGenerator kg = KeyGenerator.getInstance("DES");
            kg.init(new SecureRandom());
            SecretKey key = kg.generateKey();
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            Class spec = Class.forName("javax.crypto.spec.DESKeySpec");
            DESKeySpec ks = (DESKeySpec) skf.getKeySpec(key, spec);
            ObjectOutputStream oos = new ObjectOutputStream(
                        new FileOutputStream("keyfile"));
            oos.writeObject(ks.getKey());

            Cipher c = Cipher.getInstance("DES/CFB8/NoPadding");
            c.init(Cipher.ENCRYPT_MODE, key);
            CipherOutputStream cos = new CipherOutputStream(new FileOutputStream("Imagem.cripto"), c);
            //FileOutputStream saida=new FileOutputStream("TripleDES2.class");
            FileInputStream arq = new FileInputStream ("eu23.png"); 
   			//DataInputStream in   = new DataInputStream (arq);
            int size=arq.available();
            byte[] ler=new byte[size];
            arq.read(ler,0,size);
            //DataOutputStream pw = new DataOutputStream(cos);
            //DataOutputStream pw = new DataOutputStream(cos);
            cos.write(ler,0,size);
            //saida.write(ler,0,size);
           //saida.close();
            //pw.write("Vinicius Alves das Neves".getBytes(),0,);
            cos.close();
            
            /*            
            PrintWriter pw = new PrintWriter(new OutputStreamWriter(cos));
            pw.println("Vinicius Alves das Neves");
            pw.close();
            */
            oos.writeObject(c.getIV());
            oos.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
-------------------------------------------------------------------------------------


Classe q uso para descriptografar
-------------------------------------------------------------------------------------


import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class hjDecrypt {
    public static void main(String args[]) {
        try {
            ObjectInputStream ois = new ObjectInputStream(
                        new FileInputStream("keyfile"));
            DESKeySpec ks = new DESKeySpec((byte[]) ois.readObject());
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            SecretKey key = skf.generateSecret(ks);

            Cipher c = Cipher.getInstance("DES/CFB8/NoPadding");
            c.init(Cipher.DECRYPT_MODE, key, 
                   new IvParameterSpec((byte[]) ois.readObject()));
                   
            FileInputStream classeCripto=new FileInputStream("Imagem.cripto");       
            CipherInputStream cis = new CipherInputStream(classeCripto, c);
            
            FileOutputStream arq = new FileOutputStream ("eu232.png");  
            	           
            DataInputStream pw = new DataInputStream(cis); 
                       
            int tam=classeCripto.available();
            byte[] ler=new byte[tam];
            cis.read(ler,0,tam);
            arq.write(ler,0,tam);
           
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

Seu código está bem confuso. O código comentado volta e meia me fazia ter conclusões erradas do que estava sendo feito.
Eu nunca usei CipherOutputStream, portanto não sei se está 100% correto o seu código. O que eu acho que possa estar dando o erro talvez seja você usar um algoritmo "NoPadding". Pelo o que eu sei, neste caso o algoritmo não vai colocar o padding. Para arquivos texto acho que não haveria problemas, mas como é um binario eu não sei o que vai acontecer. Faça um teste com um arquivo texto com 7 caracteres , 8 caracteres e 9 caracteres para ver se critografa e decritografa corretamente.

T

Ele está usando CFB8/NoPadding para evitar que o arquivo criptografado fique com tamanho diferente do tamanho original.

Mas eu não sei o que ocorre se a pessoa não inicializa corretamente o IV (Vetor de Inicialização) no modo CFB8.

Um dos problemas mais evidentes é que tem um monte de arquivos que são abertos e não são fechados - isso (principalmente quanto ao arquivo com a chave) pode dar problemas. Por acaso o arquivo criptografado ficou com o mesmo tamanho do arquivo original?

R

Estou fazendo um trabalho de curso igual ao seu que fez em 2007, conseguiu terminar seu projecto?
Me pode ceder um link do material, para me ajudar a completar o meu projeto?
Muito obrigado

N

REMB:
Estou fazendo um trabalho de curso igual ao seu que fez em 2007, conseguiu terminar seu projecto?
Me pode ceder um link do material, para me ajudar a completar o meu projeto?
Muito obrigado

tambem fiquei interessado nisso

S

Pra que serve criptografar uma imagem? Se for para esconder ela no arquivo, não da pra juntar toda informação q tem dentro do png, salvar em um arquivo .cript sei lá, e separar a informação de cada imagem com um \u0000

Alguém pode me dizer a aplicação por favor?

Criado 20 de janeiro de 2007
Ultima resposta 12 de dez. de 2014
Respostas 5
Participantes 6