2014-11-01 167 views
0

我想密码文件,并将密钥保存在文件中,如加密的文本密钥。密码和解密文件

然后我想从文件中取出密钥,并使用该密钥解密文件。

我有下面的代码,

public class JavaApplication8 { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, FileNotFoundException, ClassNotFoundException { 
    // TODO code application logic here 

    cifrarFicheiro(); 
    decifrarFicheiro(); 

} 
public static void cifrarFicheiro() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{ 
    File t1 = new File("t1.txt"); 
    FileInputStream Fin= new FileInputStream(t1); 
    byte[] texto= new byte[(int)t1.length()]; 
    Fin.read(texto); 
    Fin.close(); 

    SecretKey key = KeyGenerator.getInstance("DES").generateKey(); 
    Cipher cifra = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
    cifra.init(Cipher.ENCRYPT_MODE, key); 
    byte[] chave = key.getEncoded(); 
    byte[] texto_cifrado = cifra.doFinal(texto); 

    FileOutputStream fout = new FileOutputStream("t1_t.txt"); 
    ObjectOutputStream obj = new ObjectOutputStream(fout); 
    fout.write(texto_cifrado); 
    obj.writeObject(chave); 
    obj.close(); 
    fout.close(); 

} 
public static void decifrarFicheiro() throws FileNotFoundException, IOException, ClassNotFoundException{ 
    FileInputStream fin = new FileInputStream("t1_t.txt"); 
    ObjectInputStream obj = new ObjectInputStream(fin); 

    SecretKey chave = (javax.crypto.SecretKey)obj.readObject(); 
    byte []keyCifrada = chave.getEncoded(); 
    obj.close(); 

    FileOutputStream fout = new FileOutputStream("t1_chave.txt"); 
    ObjectOutputStream obj1 = new ObjectOutputStream(fout); 
    obj1.writeObject(keyCifrada); 
    byte [] text = new byte[fin.available()]; 
    fin.read(text); 

} 

} 

但我得到下面的异常:

Exception in thread "main" java.io.StreamCorruptedException: invalid type code: F9 
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1377) 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
     at javaapplication8.JavaApplication8.decifrarFicheiro(JavaApplication8.java:59) 
     at javaapplication8.JavaApplication8.main(JavaApplication8.java:31) 
    Java Result: 1 

谁能帮助我? :)

回答

0

首先,密码和解密方法应该是对称的。您正在调用两次写入操作,只能读取一次。如果你有一个ObjectOutputStream包装文件输出流,那么这两个调用都应该在ObjectOutputStream上进行。 StreamCorruptedException在流中的元数据损坏时启动。调用flush方法来防止(我认为)。无论哪种方式,你应该:writeObject(texto_cifrado),writeObject(key),flush。然后read_Object(texto_cifrado),read_object(key)。 ACHO阙assim funciona笑

-1

公共类JavaApplication8 {

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, FileNotFoundException, ClassNotFoundException { 
    // TODO code application logic here 

    cifrarFicheiro(); 
    decifrarFicheiro(); 

} 
public static void cifrarFicheiro() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{ 
    File t1 = new File("t1.txt"); 
    FileInputStream Fin= new FileInputStream(t1); 
    byte[] texto= new byte[(int)t1.length()]; 
    Fin.read(texto); 
    Fin.close(); 

    SecretKey key = KeyGenerator.getInstance("DES").generateKey(); 
    Cipher cifra = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
    cifra.init(Cipher.ENCRYPT_MODE, key); 
    byte[] chave = key.getEncoded(); 
    byte[] texto_cifrado = cifra.doFinal(texto); 

    FileOutputStream fout = new FileOutputStream("t1_t.txt"); 
    ObjectOutputStream obj = new ObjectOutputStream(fout); 
    obj.writeObject(texto_cifrado); 
    obj.writeObject(chave); 
    obj.close(); 
    fout.close(); 

} 
public static void decifrarFicheiro() throws FileNotFoundException, IOException, ClassNotFoundException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{ 
    FileInputStream fin = new FileInputStream("t1_t.txt"); 
    ObjectInputStream obj = new ObjectInputStream(fin); 

    byte[] texto = (byte[]) obj.readObject(); 
    byte[] chave = (byte[]) obj.readObject(); 
    obj.close(); 

    FileOutputStream fout = new FileOutputStream("t1_chave.txt"); 
    ObjectOutputStream obj1 = new ObjectOutputStream(fout); 
    obj1.writeObject(chave); 

    FileOutputStream fout1 = new FileOutputStream("t1_texto.txt"); 
    ObjectOutputStream obj2 = new ObjectOutputStream(fout1); 
    obj2.writeObject(texto); 

    SecretKey sks = new SecretKeySpec(chave, "DES"); 
    Cipher c= Cipher.getInstance("DES/ECB/PKCS5Padding"); 
    c.init(Cipher.DECRYPT_MODE,sks); 
    byte[] aux=c.doFinal(texto); 

    FileOutputStream fout2 = new FileOutputStream("t1_final.txt"); 
    fout2.write(aux); 
} 

}

我能解决这个问题。如果使用对象,则可以将它写入文件中并按照相同的顺序读取它。在cifrarFicheiro()函数中,我使用ObjectInputStream并写入文本,然后按键。然后在decifrarFicheiro()函数中使用了ObjectOutputStream,现在我知道第一个对象是文本,第二个对象是关键字。

+0

你能否在你的回答中解释你是如何解决错误的。 – WannaBeCoder 2014-11-01 20:42:40