我正在嘗試編寫幾個幫助程序方法來照顧讀取和寫入加密文件。我有兩種方法成功地實現了這一點,並返回一個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解密文件和檢索原始字符串。
它確實很重要。在二進制數據上使用Writer或Reader是不正確的。 – EJP
你是對的,先生。但是,如果您實際上已經閱讀過我的問題,那麼您會注意到我使用編寫器將一個字符串寫入了一個Stream。之後會發生加密。後來,在解密已經發生之後,我使用讀取器從流中讀取一個字符串。我並不是說你錯了,但是你解決了錯誤的問題,我不喜歡因爲溝通不暢而被低估。 – user3471447
變量消息是一個字符串,請注意它顯示在輸出中打印的效果如何。 – user3471447