求解 java 对压缩文件zip 加密 !

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解 java 对压缩文件zip 加密 !相关的知识,希望对你有一定的参考价值。

所谓多zip加密,实际上就是一种对zip字节流的一种对称加密~其中解密的密码,就是对称加密中的密钥

加密后的字节保存为一个.zip的文件,打开之前必须输入密码(密钥),通过密钥将文件的字节转换成为普通的zip字节,就能读取出来了~
最好是写一个加密的输入输出流,将zip的输入输出流包装一下
参考技术A 在读写流中,对数据进行处理,这样加密别的zip工具就打不开了。 参考技术B 你要什么加密效果?是只有你自己的程序能解密?还是winzip之类的通用程序能通过密码解密?

使用JAVA解压加密的中文ZIP压缩包

近来项目中需要对ZIP压缩包解压,然后将解压后的内容存放到指定的目录下。

该压缩包的特性:

  1. 使用标准的zip压缩格式(压缩算法没有深入探究)
  2. 压缩包中带有目录并且目录名称是中文
  3. 压缩时加了密码

因为jre中自带的java.util.zip.*包不支持中文及加密压缩,所以选择使用zip4j包。

下面是解压的实现代码:

 1 public class UnZip {
 2     private final int BUFF_SIZE = 4096;
 3     
 4     /*
 5     获取ZIP文件中的文件名和目录名
 6     */
 7     public void getEntryNames(String zipFilePath, String password){
 8         List<String> entryList = new ArrayList<String>();
 9         ZipFile zf;
10         try {
11             zf = new ZipFile(zipFilePath);
12             zf.setFileNameCharset("gbk");//默认UTF8,如果压缩包中的文件名是GBK会出现乱码
13             if(zf.isEncrypted()){
14                 zf.setPassword(password);//设置压缩密码
15             }
16             for(Object obj : zf.getFileHeaders()){
17                 FileHeader fileHeader = (FileHeader)obj;
18                 String fileName = fileHeader.getFileName();//文件名会带上层级目录信息
19                 entryList.add(fileName);
20             }
21         } catch (ZipException e) {
22             e.printStackTrace();
23         }
24         return entryList;
25     }
26 
27     /*
28     将ZIP包中的文件解压到指定目录
29     */
30     public void extract(String zipFilePath, String password, String destDir){
31         InputStream is = null;
32         OutputStream os = null;
33         ZipFile zf;
34         try {
35             zf = new ZipFile(zipFile);
36             zf.setFileNameCharset("gbk");
37             if(zf.isEncrypted()){
38                 zf.setPassword(PASSWORD);
39             }
40             
41             for(Object obj : zf.getFileHeaders()){
42                 FileHeader fileHeader = (FileHeader)obj;
43                 String destFile = destDir + "/" + fileHeader.getFileName();
44                 if(!destFile.getParentFile().exists()){
45                     destFile.getParentFile().mkdirs();//创建目录
46                 }
47                 is = zf.getInputStream(fileHeader);
48                 os = new FileOutputStream(destFile);
49                 int readLen = -1;
50                 byte[] buff = new byte[BUFF_SIZE];
51                 while ((readLen = is.read(buff)) != -1) {
52                     os.write(buff, 0, readLen);
53                 }
54             }
55         }catch(Exception e){
56             e.printStackTrace();
57         }finally{
58             //关闭资源
59             try{
60                 if(is != null){
61                     is.close();
62                 }
63             }catch(IOException ioe){}
64             
65             try{
66                 if(os != null){
67                     os.close();
68                 }
69             }catch(IOException ioe){}
70         }
71     }
72 }

 

以上代码未经测试,仅作为伪代码参考

以上是关于求解 java 对压缩文件zip 加密 !的主要内容,如果未能解决你的问题,请参考以下文章

如何用java 将文件加密压缩为zip文件.

实用技巧7-Zip如何加密压缩文件?

java工具类 文件zip压缩 base64 加密,base64解密 zip解压

zip4j 2.x使用,Java实现文件压缩与解压,加密压缩,ZipParameters ZipFile使用

zip4j 2.x使用,Java实现文件压缩与解压,加密压缩,ZipParameters ZipFile使用

关于java解压缩文件(rar或者zip),压缩的文件是按文件的原目录来压缩的,并不是在同一个文件夹中。