2016-04-22 60 views
0

我试图加密和解密.txt文件。加密工作正常,但是当我解密它时.txt文件是空的。这里是我的代码:Java解密丢失文本

package crypto; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.security.InvalidAlgorithmParameterException; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 

import javax.crypto.*; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 


public class MyCrypto 
{ 
    SecretKeySpec key; 
    Cipher cipher; 
    byte[] iv = {0,0,0,0,0,0,0,0}; 
    IvParameterSpec ivspec = new IvParameterSpec(iv); 

    MyCrypto() throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException 
    { 
     key =new SecretKeySpec("22042016".getBytes(), "DES"); 
     cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
    } 

    public void encrypt(File file) throws InvalidKeyException, IOException 
    { 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     FileInputStream fis = new FileInputStream(file); 
     FileOutputStream fos = new FileOutputStream(file); 
     CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

     byte[] block = new byte[8]; 
     int i; 
     while ((i = fis.read(block)) != -1) { 
     cos.write(block, 0, i); 
     } 
    cos.close(); 
    fis.close(); 
    } 

    public void decrypt(File file) throws IOException, InvalidKeyException, InvalidAlgorithmParameterException 
    { 
     cipher.init(Cipher.DECRYPT_MODE, key, ivspec); 
     FileInputStream fis = new FileInputStream(file); 
     CipherInputStream cis = new CipherInputStream(fis, cipher); 
     FileOutputStream fos = new FileOutputStream(file); 

     byte[] block = new byte[8]; 
     int i; 
     while ((i = cis.read(block)) != -1) { 
     fos.write(block, 0, i); 
     } 
     cis.close(); 
     fos.close(); 


    } 

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, InvalidAlgorithmParameterException 
    { 
     MyCrypto crypto = new MyCrypto(); 
     File cryptoFile = new File(".../crypto.txt"); 
     crypto.encrypt(cryptoFile); 
     crypto.decrypt(cryptoFile); 
    } 
} 

我知道DES不是很安全。但这只是为了解决de和encryption问题。

+0

的IV必须是不可预知的(读:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定何时之前发送了相同的消息前缀。 IV不是秘密的,所以你可以把它和密文一起发送。通常,它只是在密文前面加上,然后在解密之前切掉。 –

+0

谢谢。但它仅用于加密游戏的保存文件,以便任何人都不能乱用它并修改它们的进度。但是,请你解释为什么我需要两个独立的文件? –

回答

0

尝试用这个替换您的解密方法的代码:

 // write decrypted bytes 
     fos.write(cipher.doFinal(Files.readAllBytes(file.toPath()))); 
     // close the output file 
     fos.flush(); 
     fos.close(); 
+2

使用*两个*'File'引用而不是一个会更好。 –

+0

不,它没有工作。错误保持不变。 –

+0

查看Artjom的评论。尝试为加密/解密文件使用单独的文件引用。 – Ben