1. 程式人生 > >Android下zip壓縮檔案加密解密的完美解決方案

Android下zip壓縮檔案加密解密的完美解決方案

前言

一個多月前,因專案需要對Java語言下的zip格式壓縮檔案的處理作了一些瞭解,嘗試了多種開源專案並寫了幾篇部落格做記錄:

 ZIP4J,作為解決了我的問題的終極解決方案,本來一開始在搜尋引擎上就看到了它的蹤跡,但因天朝的網路環境問題,zip4j的官網一直無法訪問,最終使我多走了好多冤枉路,期間試過JDK的zip包,試過Apache的zip解決方案,也試過如winzipaes等其它的開源框架,最終沒有滿足自己的需求,最後,我不得已掛了一下代理將zip4j下載了下來,試用了一下,果然威力無比,所到之處所向披靡...

閒話少說,如果需要可以到zip4j的官網下載該開源專案:

不過需要提醒的是可能無法直接訪問,如果無法正常訪問,請自行準備代理訪問,如果各位嫌麻煩,可以到這裡下載

這是我的CSDN資源連結,下載需要3分,您如果分數不多,可以留言索取,呵呵...我也需要積分,請諒解!

官網上下載的資源好像是不帶API幫助文件的,我利用其原始碼生成了一份,也一併打在我的資原始檔中,希望能幫到大家。

ZIP4J的官方說明

(自己翻譯了一下,英文不好,呵呵...)

Key features(主要特性):

  • Create, Add, Extract, Update, Remove files from a Zip file
    針對ZIP壓縮檔案建立、新增、抽出、更新和移除檔案
  • Read/Write password protected Zip files
    (讀寫有密碼保護的Zip檔案)
  • Supports AES 128/256 Encryption
    (支援AES 128/256演算法加密)
  • Supports Standard Zip Encryption
    (支援標準Zip演算法加密)
  • Supports Zip64 format
    (支援zip64格式)
  • Supports Store (No Compression) and Deflate compression method
    (支援Store(非壓縮)和Deflate壓縮方法---不太明白)
  • Create or extract files from Split Zip files (Ex: z01, z02,...zip)
    (針對分塊zip檔案建立和抽出檔案)
  • Supports Unicode file names
    (支援Unicode編碼檔名)
  • Progress Monitor
    (進度監控)

從上面的主要特性可以看出,zip4j的功能是非常強大的,完全可以利用其寫個類似於好壓的zip檔案管理軟體,但我們用地最多的可能還是利用其作一些簡單的解壓和壓縮操作,其它的功能極少觸碰,我也一樣,呵呵...

使用注意點


zip4j預設採用UTF-8編碼,所以它支援中文,同時也支援密碼,而且支援多種壓縮演算法,可以說功能強大,但使用起來卻非常簡單,當然,如果需求比較複雜,那就得好好去研究了。如果你僅僅是簡單地解壓一個zip壓縮檔案,那麼只需要簡單地幾步即可:

  1. publicstaticvoid unzip(File zipFile, String dest, String passwd) throws ZipException {    
  2.         ZipFile zFile = new ZipFile(zipFile);  // 首先建立ZipFile指向磁碟上的.zip檔案  
  3.         zFile.setFileNameCharset("GBK");       // 設定檔名編碼,在GBK系統中需要設定  
  4.         if (!zFile.isValidZipFile()) {   // 驗證.zip檔案是否合法,包括檔案是否存在、是否為zip檔案、是否被損壞等  
  5.             thrownew ZipException("壓縮檔案不合法,可能被損壞.");    
  6.         }    
  7.         File destDir = new File(dest);     // 解壓目錄  
  8.         if (destDir.isDirectory() && !destDir.exists()) {    
  9.             destDir.mkdir();    
  10.         }    
  11.         if (zFile.isEncrypted()) {    
  12.             zFile.setPassword(passwd.toCharArray());  // 設定密碼  
  13.         }    
  14.         zFile.extractAll(dest);      // 將檔案抽出到解壓目錄(解壓)  
  15.     }    

 當然將指定檔案壓縮成zip檔案也是非常簡單的事,此處不再貼程式碼,如有需要請參看下面的完整示例。

 提示:如果將要解壓的壓縮檔案中的檔名含有中文,解壓時需要注意一點,就是設定檔名字符集方法

  1. zFile.setFileNameCharset("GBK");   

這個方法的呼叫一定要靠前,要靠多前呢?其實最好在建立ZipFile之後就設定上,至少要在

  1. zFile.isValidZipFile()    

這個方法呼叫之前呼叫,我在應用時因為這個問題耽誤好久,最後檢視原始碼才弄明白,好像是ZipFile在驗證方法中就將編碼設定好,以後就不再對檔名編碼作改變了。

完整示例


下面提供一個自己寫的例子,鄙人才疏學淺,天分也差,寫的程式碼質量很差,斗膽貼上,希望能起到拋磚引玉的作用。

  1. package com.ninemax.cul.util;  
  2. import java.io.File;  
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.List;  
  6. import org.apache.commons.lang3.StringUtils;  
  7. import net.lingala.zip4j.core.ZipFile;  
  8. import net.lingala.zip4j.exception.ZipException;  
  9. import net.lingala.zip4j.model.FileHeader;  
  10. import net.lingala.zip4j.model.ZipParameters;  
  11. import net.lingala.zip4j.util.Zip4jConstants;  
  12. /** 
  13.  * ZIP壓縮檔案操作工具類 
  14.  * 支援密碼 
  15.  * 依賴zip4j開源專案(http://www.lingala.net/zip4j/) 
  16.  * 版本1.3.1 
  17.  * @author ninemax 
  18.  */
  19. publicclass CompressUtil {  
  20.     /** 
  21.      * 使用給定密碼解壓指定的ZIP壓縮檔案到指定目錄 
  22.      * <p> 
  23.      * 如果指定目錄不存在,可以自動建立,不合法的路徑將導致異常被丟擲 
  24.      * @param zip 指定的ZIP壓縮檔案 
  25.      * @param dest 解壓目錄 
  26.      * @param passwd ZIP檔案的密碼 
  27.      * @return 解壓後文件陣列 
  28.      * @throws ZipException 壓縮檔案有損壞或者解壓縮失敗丟擲 
  29.      */
  30.     publicstatic File [] unzip(String zip, String dest, String passwd) throws ZipException {  
  31.         File zipFile = new File(zip);  
  32.         return unzip(zipFile, dest, passwd);  
  33.     }  
  34.     /** 
  35.      * 使用給定密碼解壓指定的ZIP壓縮檔案到當前目錄 
  36.      * @param zip 指定的ZIP壓縮檔案 
  37.      * @param passwd ZIP檔案的密碼 
  38.      * @return  解壓後文件陣列 
  39.      * @throws ZipException 壓縮檔案有損壞或者解壓縮失敗丟擲 
  40.      */
  41.     publicstatic File [] unzip(String zip, String passwd) throws ZipException {  
  42.         File zipFile = new File(zip);  
  43.         File parentDir = zipFile.getParentFile();  
  44.         return unzip(zipFile, parentDir.getAbsolutePath(), passwd);  
  45.     }  
  46.     /** 
  47.      * 使用給定密碼解壓指定的ZIP壓縮檔案到指定目錄 
  48.      * <p> 
  49.      * 如果指定目錄不存在,可以自動建立,不合法的路徑將導致異常被丟擲 
  50.      * @param zip 指定的ZIP壓縮檔案 
  51.      * @param dest 解壓目錄 
  52.      * @param passwd ZIP檔案的密碼 
  53.      * @return  解壓後文件陣列 
  54.      * @throws ZipException 壓縮檔案有損壞或者解壓縮失敗丟擲 
  55.      */
  56.     publicstatic File [] unzip(File zipFile, String dest, String passwd) throws ZipException {  
  57.         ZipFile zFile = new ZipFile(zipFile);  
  58.         zFile.setFileNameCharset("GBK");  
  59.         if (!zFile.isValidZipFile()) {  
  60.             thrownew ZipException("壓縮檔案不合法,可能被損壞.");  
  61.         }  
  62.         File destDir = new File(dest);  
  63.         if (destDir.isDirectory() && !destDir.exists()) {  
  64.             destDir.mkdir();  
  65.         }  
  66.         if (zFile.isEncrypted()) {  
  67.             zFile.setPassword(passwd.toCharArray());  
  68.         }  
  69.         zFile.extractAll(dest);  
  70.         List<FileHeader> headerList = zFile.getFileHeaders();  
  71.         List<File> extractedFileList = new ArrayList<File>();  
  72.         for(FileHeader fileHeader : headerList) {  
  73.             if (!fileHeader.isDirectory()) {  
  74. 相關推薦

    Androidzip壓縮檔案加密解密完美解決方案

    前言 一個多月前,因專案需要對Java語言下的zip格式壓縮檔案的處理作了一些瞭解,嘗試了多種開源專案並寫了幾篇部落格做記錄:  ZIP4J,作為解決了我的問題的終極解決方案,本來一開始在搜尋引擎上就看到了它的蹤跡,但因天朝的網路環境問題,zi

    Android:Activity 與 Fragment 通訊 (99%) 完美解決方案

    前言 最近一直在想著能否有一種更好的方案來解決:Android中Activity與Fragment之間通訊的問題,什麼叫更好呢,就是能讓Fragment的複用性高,效能還有好(不用反射),程式碼還要好維護,不需要為每對Activity和Fragment之間定義介面而發愁。

    macos\Linux使用fcrackzip破解zip壓縮檔案密碼

    加密解密:http://www.lybbn.cn/data/datas.php?yw=133 1.fcrackzip簡介   fcrackzip是一款專門破解zip型別壓縮檔案密碼的工具,工具小巧方便、破解速度快,能使用字典和指定字符集破解,適用於linux、mac osx 系

    Android 解壓 Zip 壓縮檔案

    文章目錄 1、簡介 2、程式碼結構 3、AndroidManifest.xml 新增 sd 卡讀寫許可權 4、MainActivity 檔案 5、效果檢視

    Android端可用的AES加密/解密,已直接封裝為檔案加密

    主要功能類 AESHelper .java import android.util.Log; import java.io.File; import java.io.IOException; import java.io.RandomAccessFi

    Android 視訊&檔案,加密 解密

    Application 全域性 public static List<String> songLock = new ArrayList<>(); //加密的兒歌 /** * 視訊檔案 下載完成時呼叫 * 加密單個視訊 * @param

    [轉] ubuntu壓縮檔案 .tar.gz;.tar;.bz2;.tar.bz2;.bz;.tar.bz;.zip

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是壓縮!) .gz 解壓1:gunzip FileName.gz 解壓2:gzip -d File

    android加密解密完美教程

    常用加密演算法:DES、3DES、RC4、AES,RSA等; 對稱加密:des,3des,aes 非對稱加密:rsa 不可逆加密:md5 加密模式:ECB、CBC、CFB、OFB等; 填充模式:NoPadding、PKCS1Padding、PKCS5Paddi

    mac電腦使用fcrackzip破解zip壓縮檔案密碼

    fcrackzip簡介 fcrackzip是一款專門破解zip型別壓縮檔案密碼的工具,工具小巧方便、破解速度快,能使用字典和指定字符集破解,適用於linux、mac osx 系統 fcrackzip安裝 brew install fcrackzip fcrackzip

    C++解壓zip壓縮檔案

    前言 最近做專案需要用到網路下載壓縮檔案並解壓至指定資料夾,本意是使用zlib庫,但是花費許久時間仍沒有編譯通過官網的檔案,於是放棄,轉而尋求其他方法,在之前的部落格中有說道用system呼叫shell命令的方式使用winrar解壓,但是這種方法有一個弊端就是要求客戶端必須安裝winrar,

    linux壓縮檔案中文亂碼問題的解決

    在windows上壓縮的檔案,是以系統預設編碼中文來壓縮檔案。由於zip檔案中沒有宣告其編碼,所以linux上的unzip一般以預設編碼解壓,中文檔名會出現亂碼。 雖然2005年就有人把這報告為bug, 但是info-zip的官方網站沒有把自動識別編碼列入計劃,可能他們不認為這是個問題。Sun對java中存在

    zip壓縮檔案處理方案(Zip4j壓縮和解壓)

    主要特性 Create, Add, Extract, Update, Remove files from a Zip file針對ZIP壓縮檔案建立、新增、抽出、更新和移除檔案 Read/Write password protected Zip files(讀寫有密碼保護的Zip檔案

    Android版本的 Wannacry 檔案加密病毒樣本分析 附帶鎖機

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    ABAP 生成ZIP壓縮檔案的程式碼

    DATA: IZIP       TYPE REF TO CL_ABAP_ZIP,       CONT  

    python讀取zip壓縮檔案裡面的csv資料

     利用zipfile模組和pandas獲取資料,程式碼比較簡單,做個記錄吧: # -*- coding: utf-8 -*- """ Created on Tue Aug 21 22:35:59 2018 @author: FanXiaoLei """ from zipfile im

    匯出多級資料到excel並且生成zip壓縮檔案下載

    為了實現以下如圖的效果 首先:需要的jar包 jxl      生成excel ant (org.apache.tools.ant) 生成zip壓縮檔案   1.建立目錄結構,最後生成壓縮包: String realPa

    python3 RSA演算法生成祕鑰對、檔案加密解密

    RSA檔案加密解密生成祕鑰對檔案加密檔案解密 生成祕鑰對 @staticmethod def create_rsa_keys(code='nooneknows'): # 生成 2048 位的 RSA 金鑰 key

    檔案加密解密到RSA加密演算法

    1.檔案的加密解密        其實檔案的加密解密我們可以理解成在複製檔案時對檔案中的每一個位元組做一些操作,比如最簡單的就是加上一個常數或一個隨機數,還有取模等,只要把它變成不是原本的模樣就OK了。       以下給出生成隨機數的方式加密:MyKey是一個生成128

    java 將資料夾壓縮zip壓縮檔案

    還記得壓縮檔案是我剛入職時,師傅讓我完成的案例,當時把我愁的哦。剛才用到,才發現忘得差不多了。哎,都是不長回頭惹的禍啊。回頭看了下 在這裡記錄下。方便自己也方便了他人麼,不足地方請各位指出呢! 其實壓縮檔案並不是太難,在這裡主要就是對IO流、ZIP的運用,挺有意思的一個案例。 現在對過程捋一

    匯出 zip 壓縮檔案

    /**      * 匯出zip檔案 list<String> 為 寫入到本地的檔案      * @param request      * @param response      * @param exportExcel      * @param file