java文件加密压缩及解密-流程图及源码

更新时间:2024-07-01 16:56:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

文件加密压缩以及解密

两种方式:

1. 文件内容加密:首先对文件内容进行加密,然后压缩;对应的先解压,再对文件进行密

匙匹配,匹配成功对文件解密

2. ZIP4J:引入jar包,给文件添加密匙进行压缩,必须输入密码才可以打开文件。通过

密码将文件进行解压缩。

1.1文件内容加密流程图

01.初始化srcPathName:源文件,destPathName:目的文件,key:密匙 以流的形式打开目的文件ZipOutputStream out Y 02.根据(文件夹/文件)来执行不同压缩方法file.isDirectory() N 03.对文件加密 04.给文件添加密匙 05.压缩文件 取出目录下的文件,再次进行类型判断 结束

流程图对应的具体方法 序号 对应方法名 01 相关参数 Main函数调用入口 srcPathName:源文件路径 public void compressExe(StringsrcPathName,String destPathName,String destPathName:目标文件路key) 径 key:密匙 判断压缩目标是“目录(文件夹)”、“文件” srcPathName:要被操作的文private void compressByType(String srcPathName,ZipOutputStream 件路径 out,String basedir,String key) out:压缩文件流 key:密匙 文件加密 srcPathName:要被操作的文private void compressFile(String srcPathName, ZipOutputStream out, String 件路径 basedir,String key)代码前面部分 out:压缩文件流 key:密匙 02 03 04 05 添加密匙 public static void appendLock(String fileName,String key) fileName:文件路径 key:密匙 压缩文件 srcPathName:要被操作的文private void compressFile(String srcPathName, ZipOutputStream out, String 件路径 basedir,String key)代码在后面部分 out:压缩文件流 key:密匙

1.2文件加密方法:

创建一个新的添加文件destFile,存放加密后的文件 创建长度为1024的内存空间 buffer,存放读取字节 Buffer2,存放加密后的字节 While((r=in.read(buffer))>0) 读字节到数组buffer中,r读入的字节数 Y //循环得到buffer[i],将字节位移加密,存放在buffer2中 For(int i = 0; i

1.3文件压缩

读取压缩文件流BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(srcPathName))); 创建压缩包入口,并放入目标流out ZipEntry entry = new ZipEntry(basedir+new File(srcPathName).getName()) out.putNextEntry(entry); 创建长度为BUFFER的内存空间 data,存放读取字节 byte data[] = new byte[BUFFER]; N While((count =bis.read(data,0,BUFFER))!=-1) 读字节到数组buffer中,r读入的字节数 Y 将 data,写入out中 out.write(data,0,count);out.flush(); bis文件流关闭 压缩完成

1.4文件解压 整体流程图:

01.解压文件 02.对解压后的文件进行密匙匹配 N 密匙匹配成功 密匙错误 Y 03.对文件解密 结束

序号 对应方法名 01 Main函数调用入口,首先解压文件 public static void unZipFiles(String zipFile,String descDir,String key) 匹配密匙 public static boolean matchLock(String fileName,String key) 文件解密 public static String decrypt(String srcPathName, String key) 相关参数 zipFile:源zip路径 descDir:文件输出路径 key:密匙 fileName:文件路径 key:密匙 srcPathName:要被操作的文件路径 key:密匙 02 03 具体解压流程图如下:

01.初始化压缩写文件流ZipInputStream Zin=new ZipInputStream(new FileInputStream(zipFile));zipFile:待解压zip路径 读压缩文件流outBufferedInputStream Bin=new BufferedInputStream(Zin); N While((entry = Zin.getNextEntry())!=null && !entry.isDirectory()) 压缩文件流入口不为空时 Y 初始化目标地址文件。File Fout =new File(“输出文件地址”,entry.getName()); 创建输出地址文件流。FileOutputStream out=new FileOutputStream(Fout); BufferedOutputStream Bout=new BufferedOutputStream(out) while((b=Bin.read())!=-1) 读压缩文件流 Y 将Bin.read()写入输出地址流中 Bout.write(b); N Bout、out关闭 对解压的文件进行解密 decrypt(decryptFilePath,key); Bin.close(); Zin.close(); 压缩完成

1.5文件解密decrypt(decryptFilePath,key);

先匹配密匙是否正确 matchLock(String fileName,String key) 读出文件fileName中start、center、last位置(key.length()/3)字节,拼接出来与key匹配 N 结束 Y 创建一个新的添加文件destFile,存放解密后的文件 创建长度为1024的内存空间 buffer,存放读取字节 Buffer2,存放解密后的字节 //初始化文件字节总数 int mod = (int) ((file.length() - keyLength)24);int div = (int) (size>>10);//右移10位 int count = mod==0?div:(div+1); N While((k <= count && ( r = is.read(buffer)) > 0)) 读字节到数组buffer中,r读入的字节数 Y Y If(mod != 0 && k==count) N //循环得到buffer[i],将字节位移加密,存放在buffer2中 For(int i = 0; i

附源代码:

import com.zl.base.core.MethodFactory; import com.zl.base.core.db.Executer;

import com.zl.base.exception.DbException; import com.zl.common.CoreDispatchAction; import com.zl.common.MD5;

import org.apache.commons.beanutils.BasicDynaBean; import org.apache.commons.beanutils.DynaProperty; import org.apache.log4j.Logger;

import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping;

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

import java.io.RandomAccessFile; import java.util.List;

import java.util.zip.CRC32;

import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream; import java.util.zip.ZipInputStream; /*import com.zl.opt.schedule.zip4j.*; import com.zl.opt.schedule.zip4j.model.*;

import com.zl.opt.schedule.zip4j.util.Zip4jConstants; //import com.zl.opt.schedule.zip4j.core.ZipFile;

import com.zl.opt.schedule.zip4j.exception.ZipException;*/

import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

public class zipCompressor extends CoreDispatchAction { static Logger logger = Logger.getLogger(zipCompressor.class.getName());

static final int BUFFER = 8192; public zipCompressor(){ } public ActionForward createfile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ String filepath=\ String sql=\id,title,systemcode,file_passwd,sqlrule,isappoint,separator,int(current date) as datecol from S_DATAOFFERRULE where starttime <= current date and endtime >= current date\ try { List list1 = Executer.getInstance().ExecSeletSQL(sql).getResultSet(); if(list1.size()>0){ BasicDynaBean rowBean = null; String info=\ for(int i=0;i<\/script>'); document.write('