2016-04-22 57 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