java实现zip的加密、解密

//1、备份(加密)
package com.koalii.eseal.backup.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.bouncycastle.util.encoders.Base64;
import com.koalii.core.struts.action.BaseAction;
import com.koalii.eseal.admin.dto.AdminDTO;
import com.koalii.eseal.backup.struts.form.BackUpForm;
import com.koalii.eseal.log.util.LogUtil;
import com.koalii.eseal.util.KeyUtil;
import com.koalii.eseal.util.ParameterConstant;
import com.koalii.eseal.util.ZipUtil;
import com.koalii.quickstart.util.AppConstant;

/**
 * BackUpAction.java
 *
 * @CopyRight KOAL Co. Lmt 2009
 * @author zhengxd
 * @Since
 * @version
 * @Date: 2009-7-8
 */
public class BackUpAction extends BaseAction{

 
 protected Object actionExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
  // TODO Auto-generated method stub
  ZipUtil zip = new ZipUtil();
  BackUpForm backForm = (BackUpForm)form;
  String filePath = request.getRealPath("/")+ParameterConstant.FILE_PATH;//ParameterConstant.FILE_PATH=“koalii”
  String  zipPath = filePath+".zip";
  zip.zip(zipPath, filePath);
  //获得登陆用户信息
  String pass = String.valueOf(backForm.getPassWord());
  
  //加密密码  返回固定的28位长度的数组
  byte bytepass [] = new String(Base64.encode( KeyUtil.keyStorePassDgtByte(pass.getBytes()))).getBytes();
  // 读取文件流
  javax.servlet.ServletOutputStream out = response.getOutputStream();
  java.io.FileInputStream fileInputStream = new java.io.FileInputStream(
    zipPath);
  // 下载文件
  // 设置响应头和下载保存的文件名
  String filename = "koalii.zip";
  if (filename != null && filename.length() > 0) {
   response.setContentType("application/x-msdownload");
   response.setHeader("Content-Disposition", "attachment; filename="
       + new String(filename.getBytes("utf-8"),
         "iso8859-1") + "");
   if (fileInputStream != null) {
    int filelen = fileInputStream.available();
    // 文件太大时内存不能一次读出,要循环

//创建新数组,用于存储密码流+文件流
    byte a[] = new byte[filelen+bytepass.length];

//arraycopy(被复制的数组, 从第几个元素开始复制, 要复制到的数组, 从第几个元素开始粘贴, 一共需要复制的元素个数);
    System.arraycopy(bytepass, 0, a, 0, bytepass.length);   
    fileInputStream.read(a,bytepass.length,filelen);    
    byte enbyte []=Base64.encode(a);    
    out.write(enbyte);
   }
   fileInputStream.close();
   out.close();
  }
    return null;
 }
}

 

//2、恢复(解密)

 

package com.koalii.eseal.recover.struts.action;

import java.io.FileOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;
import org.bouncycastle.util.encoders.Base64;
import com.koalii.core.struts.action.BaseAction;
import com.koalii.eseal.admin.dto.AdminDTO;
import com.koalii.eseal.log.util.LogUtil;
import com.koalii.eseal.recover.struts.form.RecoverForm;
import com.koalii.eseal.util.KeyUtil;
import com.koalii.eseal.util.ParameterConstant;
import com.koalii.eseal.util.ZipUtil;
import com.koalii.quickstart.util.AppConstant;

/**
 * RecoverAction.java
 *
 * @CopyRight KOAL Co. Lmt 2009
 * @author zhengxd
 * @Since
 * @version
 * @Date: 2009-7-8
 */
public class RecoverAction extends BaseAction{

 
 protected Object actionExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
  // TODO Auto-generated method stub
  ZipUtil zip = new ZipUtil();
  RecoverForm reform = (RecoverForm)form;
  
  FormFile file = reform.getFile();
  String filePath = request.getRealPath("/")+ParameterConstant.FILE_PATH;
  //获得登陆用户信息
  AdminDTO user = (AdminDTO) request.getSession().getAttribute(AppConstant.userInSessionKey);
  if(null==user){
   super.sendMessage(request, "登陆超时,请重新登陆");
   return mapping.findForward("loginout");
  }
  String pass = String.valueOf(reform.getPassWord());
  //存储加密文件的所有数据
  byte[] all = file.getFileData();
  //存储解密后的所有数据
  byte[] deall = Base64.decode(all);
  //设置密码数组长度
  byte[] passb = new byte[28];
  //从解密数据中提取出密码并放入密码数组中
  System.arraycopy(deall, 0, passb, 0, 28);
  
  //将新输入的密码bsae64加码 因为在备份时 输入的密码已经做过base64加密之后才跟文件流一起做的加密
  byte bytepass [] = new String(Base64.encode(KeyUtil.keyStorePassDgtByte(pass.getBytes()))).getBytes();
  //判断恢复密码是否正确
  if(new String(passb).equals(new String(bytepass)))
  {
   //将真实的文件内容提取出来并存入数组,因为密码加密后的长度是固定的28位  从第28位以后才是真实文件的内容
   byte[] real = new byte[deall.length-28];
   
   System.arraycopy(deall, 28, real, 0, real.length);
   
   FileOutputStream out = new FileOutputStream(filePath+".zip");
   //将真实文件写入磁盘
   out.write(real);
   out.close();
   //解压真实文件
   zip.unzip(filePath+".zip", filePath);
   ActionErrors message = new ActionErrors();
   message.add(Globals.ERROR_KEY,new ActionMessage("message", "系统恢复成功,请重新启动服务器!"));
   request.getSession().setAttribute(Globals.ERROR_KEY, message);
   
  }else{
   ActionErrors message = new ActionErrors();
   message.add(Globals.ERROR_KEY,new ActionMessage("message", "恢复密码不正确,请输入备份时填写的密码!"));
   request.getSession().setAttribute(Globals.ERROR_KEY, message);
  }
  
  return mapping.findForward("success");
 }
}

 

 

//3、zip基础类

 

package com.koalii.eseal.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;


public class ZipUtil {
 public void zip(String zipFileName, String inputFile) throws Exception {
  zip(zipFileName, new File(inputFile));
 }

 private void zip(String zipFileName, File inputFile) throws Exception {
  ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
    zipFileName));
  zip(out, inputFile, "");
  //System.out.println("zip done");
  out.close();
 }

 public void unzip(String zipFileName, String outputDirectory)
   throws Exception {
  ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
  ZipEntry z;
  while ((z = in.getNextEntry()) != null) {
   //System.out.println("unziping " + z.getName());
   if (z.isDirectory()) {
    String name = z.getName();
    name = name.substring(0, name.length() - 1);
    File f = new File(outputDirectory + File.separator + name);
    f.mkdir();
    //System.out.println("mkdir " + outputDirectory + File.separator
    //  + name);
   } else {
    File f = new File(outputDirectory + File.separator
      + z.getName());
    f.createNewFile();
    FileOutputStream out = new FileOutputStream(f);
    int b;
    while ((b = in.read()) != -1)
     out.write(b);
    out.close();
   }
  }

  in.close();
 }

 private void zip(ZipOutputStream out, File f, String base) throws Exception {
  //System.out.println("Zipping  " + f.getName());
  if (f.isDirectory()) {
   File[] fl = f.listFiles();
   out.putNextEntry(new ZipEntry(base + "/"));
   base = base.length() == 0 ? "" : base + "/";
   for (int i = 0; i < fl.length; i++) {
    zip(out, fl[i], base +fl[i].getName());
    
   }
  } else {
   out.putNextEntry(new ZipEntry(base));
   FileInputStream in = new FileInputStream(f);
   int b;
   while ((b = in.read()) != -1){
    out.write(b);
   }
    
   in.close();
  }

 }

 public static void main(String[] args) {
  try {
   //Process process = Runtime.getRuntime().exec(new String[] { "/bin/csh", "-c","zip -P "+123456+" news.zip "+" E://test" });
   ZipUtil t = new ZipUtil();
   t.zip("E://test.zip", "E://test");
   t.unzip("E://test.zip", "E://test1");
  } catch (Exception e) {
   e.printStackTrace(System.out);
  }
 }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值