2014-03-28 66 views
-1

我正在嘗試編寫幾個幫助程序方法來照顧讀取和寫入加密文件。我有兩種方法成功地實現了這一點,並返回一個InputStream或OutputStream(實際上是Cipher版本),我可以使用它來讀取或寫入文件。我已經確認,這些方法在用Object流包裝並用於讀取和寫入加密對象到文件時工作起來非常敏銳。嘗試解密文件時CipherInputStream爲空

但是,當我嘗試從加密文本文件讀取時出現問題。我可以驗證String I提供的字符串是否正在加密並寫入正確的文件,但是當我嘗試從此文件讀回時,BufferedReader會報告EOF(null)。 InputStream.available()方法返回0.我可以確保該文件存在,正在被找到,並且InputStream本身不爲空。有人可以告訴我可能會導致這種情況嗎?

讀/寫加密的對象精美的作品(CorruptedStreamException好這裏):

 private static void testWriteObject() { 
    String path = "derp.derp"; 
    Derp start = new Derp("Asymmetril: " + message, 12543, 21.4, false); 
    FilesEnDe.writeEncryptedObject(key, "derp.derp", start); 
    echo("original"); 
    echo(">"+start); 

    Object o; 
    try { 
     ObjectInputStream ois = new ObjectInputStream(ResourceManager.getResourceStatic(path)); 
     o = ois.readObject(); 
     echo("encrypted"); 
     echo(">"+o); 
     ois.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    o = FilesEnDe.readEncryptedObject(key, path); 
    echo("decrypted"); 
    echo(">"+o); 
} 

輸出:

original 
>Asymmetril: WE CAME, WE SAW, WE CONQUERED.; 12543; 21.4; false 
[RM] > Trying to load resource: derp.derp 
java.io.StreamCorruptedException 
[RM] > Trying to load resource: derp.derp 
decrypted 
>Asymmetril: WE CAME, WE SAW, WE CONQUERED.; 12543; 21.4; false 

試圖解密文本文件不(注意,加密的文本可讀):

private static void testWriteFile() { 
    String path = "EncryptedOut.txt"; 
    BufferedReader bis1, bis2; 

    try { 
     BufferedOutputStream os = new BufferedOutputStream(FilesEnDe.getEncryptedOutputStream(key, path)); 
     os.write(message.getBytes()); 
     os.flush(); 
        os.close(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    echo("original"); 
    echo(">"+message); 

    try { 
     bis1 = new BufferedReader (new InputStreamReader(ResourceManager.getResourceStatic(path))); 
     echo("encrypted"); 
     echo(">" + bis1.readLine()); 
     bis1.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     InputStream is = FilesEnDe.getEncryptedInputStream(key, path); 
     InputStreamReader isr = new InputStreamReader(is); 
     bis2 = new BufferedReader (isr); 
     echo("bits in stream? " + is.available()); 

     echo("decrypted"); 
     echo(">"+bis2.readLine()); 
     bis2.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

輸出:

original 
>WE CAME, WE SAW, WE CONQUERED. 
encrypted 
>¤ƒ]£¬Vß4E?´?ùûe 
[RM] > Trying to load resource: EncryptedOut.txt 
bytes in stream? 0 
decrypted 
>null 

用於創建CipherInputStream的代碼:

public static InputStream getEncryptedInputStream(String key, String path) { 
    try { 
     InputStream is = ResourceManager.getResourceStatic(path); 
     SecretKeySpec keyspec = new SecretKeySpec(getHash(key),"AES"); 
     Cipher c = Cipher.getInstance("AES"); 
     c.init(Cipher.DECRYPT_MODE, keyspec); 
     return new CipherInputStream(is,c); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     e.printStackTrace(); 
    } 
    return null; 
    } 

技術問題時出現我嘗試使用CIPHERINPUTSTREAM解密文件和檢索原始字符串。

回答

-1

不管我是通過PrintWriter還是BufferedOutputStream寫的,也不管是否使用Reader讀取。事實證明,我忘了關閉創建該文件的OutputStream。只要我添加一條小線,一切就開始工作。感謝Antoniossss建議我重做我方法的破碎部分。我想知道爲什麼Eclipse沒有提到它的資源泄漏...

+0

它確實很重要。在二進制數據上使用Writer或Reader是不正確的。 – EJP

+0

你是對的,先生。但是,如果您實際上已經閱讀過我的問題,那麼您會注意到我使用編寫器將一個字符串寫入了一個Stream。之後會發生加密。後來,在解密已經發生之後,我使用讀取器從流中讀取一個字符串。我並不是說你錯了,但是你解決了錯誤的問題,我不喜歡因爲溝通不暢而被低估。 – user3471447

+0

變量消息是一個字符串,請注意它顯示在輸出中打印的效果如何。 – user3471447

1

但是,當我嘗試從加密文本文件讀取時出現問題。

沒有這樣的事情作爲'加密文本文件'。加密的結果是二進制的,而不是文本。

我可以驗證String I提供的字符串是否正在加密並寫入正確的文件,但是當我嘗試從此文件讀回時,BufferedReader會報告EOF(null)。

您不應該使用BufferedReader.這不是文本,它是二進制的。使用BufferedInputStream.

+0

請注意,我可以讀取加密文本就好了。它看起來像垃圾,因爲你是對的。我強迫這個二進制文件被讀爲文本,並且產生了很多亂碼。問題是,當我從文件創建一個CipherInputStream時,我無法從中提取任何內容,緩衝或不是,二進制或不是。儘管如此,感謝您的嘗試。 – user3471447

+1

你的問題是'有人可以告訴我可能會導致這種情況嗎?'指的是「BufferedReader」,它也是你標題的第一個字。我已經回答了。你有另一個嗎? – EJP

+0

由於使用了'PrintWriter',你的文件被損壞 - 它將輸出數據作爲文本(如char代碼)威脅到原始數據,並將一些過濾器應用於平臺編碼。使用嚴格的輸入/輸出(不是作家,讀者),一切都會很好。 – Antoniossss

相關問題