前言
-
在前一篇博客《字節流運算實現文件的加密解密1.0》裏介紹了實現文件的加密解密的原理。因爲讀取文件方法使用的是FileInputStream對文件加密時效率較低,優化爲使用BufferedOutputStream提升效率。
-
遺留的思考:字節運算超出範圍,但還是可以正常加密解密。
簡述
使用BufferedInputStream提升讀取效率
/**
* 獲取文件的byte數組
* 在{@link FileEncryptAndDecryptSalt_1#readBytes(File)}示例中使用FileInputStream字節流讀取
* 執行read時,每次都從硬盤中讀取文件字節。
* 在{@link FileEncryptAndDecryptSalt_2#readBytes(File)}示例中使用BufferedInputStream緩衝字節流讀取
* 執行read時,每次都會先從緩衝區進行讀取,默認緩衝區大小是8192字節。操作完緩衝區數據後,會從硬盤中獲取
* 下一部分字節流放在緩衝區中。緩衝區即是內存,總所周知操作內存比操作硬盤效率要高得多。
* 所以一般情況下使用BufferedInputStream & BufferedOutputStream進行操作文件,因爲效率最高
* 但是當你操作的文件小於8192字節時,read時直接讀取緩存,使用BufferedInputStream效率最高
* 當文件字節越來越大時,使用FileInputStream的效率就趨近於使用BufferedInputStream
* <p>
* 文件過大時容易造成內存溢出,最好的方式還是邊讀邊寫,內存裏不要留過多的數據
*
* @param file
* @return
* @see BufferedInputStream 緩衝輸入流
* @see FileInputStream 緩衝流
*/
private static byte[] readBytes(File file) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
byte[] flush = new byte[(int) file.length()];
while (bis.read(flush) != -1) {
return flush;
}
} catch (IOException e) {
e.printStackTrace();
}
return new byte[0];
}
字節運算
/**
* 字節碼數組加鹽
* bytes[i] = (byte) (bytes[i] + SALT);
* 在含byte類型數據運算時,Java編譯器會自動轉換byte類型爲int
* 這裏加鹽運算(bytes[i] + SALT)會轉換爲兩個int類型相加,然後強轉爲byte接收
* 因爲byte的取值範圍爲-128~127,可以將其類比爲一個時鐘:
* 從-128開始到127結束,然後又從-128開始
* 比如:(byte)(127+1) = -128
* 這樣的話就可以理解加鹽運算 {@link FileEncryptAndDecryptSalt_2#bytesAddSalt(byte[])}
* 後:(byte)(127+1) = -128,還是正常byte數據所以文件可以正常生成;
* 去鹽運算{@link FileEncryptAndDecryptSalt_2#bytesSubSalt(byte[])}
* 後:(byte)(-128-1) = 127,恢復爲原來的byte,這樣就可以生成原有文件
*
* @param bytes
* @return
*/
private static byte[] bytesAddSalt(byte[] bytes) {
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) (bytes[i] + SALT);
}
return bytes;
}
/**
* 字節碼數組去鹽
*
* @param bytes
* @return
*/
private static byte[] bytesSubSalt(byte[] bytes) {
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) (bytes[i] - SALT);
}
return bytes;
}
總結
以上兩篇博客便是介紹操作文件流對文件進行加密解密的具體原理,使用該方法可以對文件本身實現深加密。
那什麼是電腦文件?
來自某度的解釋:電腦文件,也可以稱之爲計算機文件,是存儲在某種長期儲存設備或臨時存儲設備中的一段數據流,並且歸屬於計算機文件系統管理之下。
-
深加密:對文件數據流進行加密,本質上文件已經被修改,文件無法打開或打開亂碼。
難破解,可以對重要文件加密。
-
淺加密:不修改文件數據流,本質上文件並沒有被加密。
常見方式:修改文件名稱使文件無法打開、修改、刪除或替換文件圖標爲系統圖標;隱藏文件或路徑。
很容易被破解,可以防止菜鳥偷看。
我的實現只是簡單的對文件進行數據流加密,可以用來學習,還可以再優化。