2012-06-17 41 views
0

我爲text file加密和解密編寫了以下代碼。基於密碼的en /在java中解密:即使密碼相同,也無法解密文件

加密過程正常,但我無法解密創建的文件。出於某種原因,即使我使用相同的密碼,具有相同的長度和相同的填充,解密輸出是一個不同於原來的編碼文件...

在其他嘗試我失敗時運行加密和解密分離運行。但現在,他們都在運行一個又一個的(即使他們使用不同的密鑰規格,是原因如果是這樣 - ?我怎麼能繞過它)

public static void main(String[] args) throws Exception { 
    encrypt("samplePassword", new FileInputStream("file.txt"), new FileOutputStream("enc-file.txt")); 
    decrypt("samplePassword", new FileInputStream("enc-file.txt"), new FileOutputStream("file-from-enc.txt")); 
} 

public static void encrypt(String password, InputStream is, OutputStream os) throws Exception { 

    SecretKeySpec keySpec = new SecretKeySpec(password(password), "TripleDES"); 
    Cipher cipher = Cipher.getInstance("TripleDES"); 
    cipher.init(Cipher.ENCRYPT_MODE, keySpec); 
    byte[] buf = new byte[8096]; 
    os = new CipherOutputStream(os, cipher); 
    int numRead = 0; 
    while ((numRead = is.read(buf)) >= 0) { 
     os.write(buf, 0, numRead); 
    } 
    os.close(); 
} 

public static void decrypt(String password, InputStream is, OutputStream os) throws Exception { 

    SecretKeySpec keySpec = new SecretKeySpec(password(password), "TripleDES"); 
    Cipher cipher = Cipher.getInstance("TripleDES"); 
    cipher.init(Cipher.ENCRYPT_MODE, keySpec); 

    byte[] buf = new byte[8096]; 
    CipherInputStream cis = new CipherInputStream(is, cipher); 
    int numRead = 0; 
    while ((numRead = cis.read(buf)) >= 0) { 
     os.write(buf, 0, numRead); 
    } 
    cis.close(); 
    is.close(); 
    os.close(); 
} 

private static byte[] password(String password) { 

    byte[] baseBytes = { (byte) 0x38, (byte) 0x5C, (byte) 0x8, (byte) 0x4C, (byte) 0x75, (byte) 0x77, (byte) 0x5B, (byte) 0x43, 
      (byte) 0x1C, (byte) 0x1B, (byte) 0x38, (byte) 0x6A, (byte) 0x5, (byte) 0x0E, (byte) 0x47, (byte) 0x3F, (byte) 0x31, 
      (byte) 0xF, (byte) 0xC, (byte) 0x76, (byte) 0x53, (byte) 0x67, (byte) 0x32, (byte) 0x42 }; 
    byte[] bytes = password.getBytes(); 
    int i = bytes.length; 
    bytes = Arrays.copyOf(bytes, 24); 
    if(i < 24){ 
     for(;i<24; i++){ 
      bytes[i] = baseBytes[i]; 
     } 
    } 
    return bytes; 
} 

任何一個可以給我一個提示?

+0

你可以參考從哪裏得到這可能鏈接?! – shareef

回答

1

在一個先看看,

cipher.init(Cipher.ENCRYPT_MODE, keySpec); 

也許應該

cipher.init(Cipher.DECRYPT_MODE, keySpec); 
的解密方法

看看documentation

+0

哇...沒想到我會達到... 10倍!它的工作原理(當然...) – Hovav