字節流運算實現文件的加密解密2.0

前言

  1. 在前一篇博客《字節流運算實現文件的加密解密1.0》裏介紹了實現文件的加密解密的原理。因爲讀取文件方法使用的是FileInputStream對文件加密時效率較低,優化爲使用BufferedOutputStream提升效率。

  2. 遺留的思考:字節運算超出範圍,但還是可以正常加密解密。

簡述

使用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;
    }

總結

以上兩篇博客便是介紹操作文件流對文件進行加密解密的具體原理,使用該方法可以對文件本身實現深加密。

那什麼是電腦文件?

來自某度的解釋:電腦文件,也可以稱之爲計算機文件,是存儲在某種長期儲存設備或臨時存儲設備中的一段數據流,並且歸屬於計算機文件系統管理之下。

  • 深加密:對文件數據流進行加密,本質上文件已經被修改,文件無法打開或打開亂碼。

    難破解,可以對重要文件加密。

  • 淺加密:不修改文件數據流,本質上文件並沒有被加密。

    常見方式:修改文件名稱使文件無法打開、修改、刪除或替換文件圖標爲系統圖標;隱藏文件或路徑。

    很容易被破解,可以防止菜鳥偷看。

我的實現只是簡單的對文件進行數據流加密,可以用來學習,還可以再優化。

完整代碼地址:https://gitee.com/mwk719/spring-learn/blob/master/src/main/java/com/mwk/encrypt/FileEncryptAndDecryptSalt_2.jav

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章