2013-10-16 131 views
0

要使用我的Java程序加密和解密文件。 這些文件都是編譯好的Java .class文件,我不知道我在做什麼錯。我現在只是測試,但用相同的密鑰進行加密和解密之後。它顯示文件是使用Java加密/解密文件

Exception in thread "AWT-EventQueue-0" java.lang.ClassFormatError: Truncated class file 

並且該類無法加載。 還有就是我的加密/解密類代碼:

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import javax.crypto.Cipher; 
import javax.crypto.CipherInputStream; 
import javax.crypto.CipherOutputStream; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESKeySpec; 

public class EncTool { 

public static void encrypt(String key, String filename) throws Throwable { 
    InputStream is = new FileInputStream("SomeFile.class"); 
    OutputStream os = new FileOutputStream("SomeFile.class"); 
    encrypt(key, Cipher.ENCRYPT_MODE, is, os); 
} 

public static void decrypt(String key, String filename) throws Throwable { 
    InputStream is = new FileInputStream("SomeFile.class"); 
    OutputStream os = new FileOutputStream("SomeFile.class"); 
    decrypt(key, Cipher.DECRYPT_MODE, is, os); 
} 

public static void encrypt(String key, int mode, InputStream is, OutputStream os) throws Throwable { 

    DESKeySpec dks = new DESKeySpec(key.getBytes()); 
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); 
    SecretKey desKey = skf.generateSecret(dks); 
    Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE 

     cipher.init(Cipher.ENCRYPT_MODE, desKey); 
     CipherInputStream cis = new CipherInputStream(is, cipher); 
     doCopy(cis, os); 

} 

public static void decrypt(String key, int mode, InputStream is, OutputStream os) throws Throwable { 

    DESKeySpec dks = new DESKeySpec(key.getBytes()); 
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); 
    SecretKey desKey = skf.generateSecret(dks); 
    Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE 

     cipher.init(Cipher.DECRYPT_MODE, desKey); 
     CipherOutputStream cos = new CipherOutputStream(os, cipher); 
     doCopy(is, cos); 

} 

public static void doCopy(InputStream is, OutputStream os) throws IOException { 
    byte[] bytes = new byte[64]; 
    int numBytes; 
    while ((numBytes = is.read(bytes)) != -1) { 
     os.write(bytes, 0, numBytes); 
    } 
    os.flush(); 
    os.close(); 
    is.close(); 
} 

} 

和測試IM執行這樣的說法:

try { 
     EncTool.encrypt("somekey123", "SomeFile"); 
     EncTool.decrypt("somekey123", "SomeFile"); 
    } catch (Throwable e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

我到底做錯了什麼? 或者應該怎麼做?

編輯

,當我的代碼看起來是:

public static void encrypt(String key, String filename) throws Throwable { 
     InputStream is = new FileInputStream("Somefile.class"); 
     OutputStream os = new FileOutputStream("tempfile.class"); 

     DESKeySpec dks = new DESKeySpec(key.getBytes()); 
     SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); 
     SecretKey desKey = skf.generateSecret(dks); 
     Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE 

      cipher.init(Cipher.ENCRYPT_MODE, desKey); 
      CipherInputStream cis = new CipherInputStream(is, cipher); 
      doCopy(cis, os); 

      File file2 = new File("tempfile.class");  

      File f = new File("somefile.class"); 
      f.delete(); 
      file2.renameTo(f); 
    } 

現在它的工作原理,但這些刪除和重命名的東西看起來並不優雅,我怎麼能做到這一點更有效?

+2

我不認爲這是好主意,閱讀你正在重寫的同一個文件。 – kan

回答

1

您必須將輸出寫入新文件,而不是在讀取輸入時覆蓋輸入。您的代碼編寫的方式現在結果將是未定義的。

+0

你能檢查我的編輯嗎? – pawel

+0

對我來說很好 –