java 解密zip_通过java.util.zip压缩包文件解析常见处理及安全密钥加解密ZipEncrypt处理...

该类通过对常见zip包文件通过java.util.zip包下的ZipInputStream、ZipOutputStream进行文件解/压缩处理,并通过RSA密钥安全协议对包进行加解密打包认证,具体参见代码import java.io.ByteArrayInputStream;@b@import java.io.ByteArrayOutputStream;@b@import java.io.File;@b@import java.io.FileInputStream;@b@import java.io.FileOutputStream;@b@import java.io.IOException;@b@import java.io.ObjectInputStream;@b@import java.io.ObjectOutputStream;@b@import java.security.Key;@b@import java.security.KeyPair;@b@import java.security.KeyPairGenerator;@b@import java.security.NoSuchAlgorithmException;@b@import java.security.PrivateKey;@b@import java.security.PublicKey;@b@import java.security.SecureRandom;@b@import java.util.UUID;@b@import java.util.zip.Deflater;@b@import java.util.zip.Inflater;@b@import java.util.zip.ZipEntry;@b@import java.util.zip.ZipInputStream;@b@import java.util.zip.ZipOutputStream;@b@import javax.crypto.Cipher;@b@import com.woopa.common.util.FileUtils;@b@@b@public class ZipEncrypt {@b@private PrivateKey privateKey = null;@b@private PublicKey publicKey = null;@b@@b@/**@b@ * 解压缩文件.@b@ * @b@ * @param intputFilePath@b@ *            要解压缩文件路径及文件名@b@ * @param outputFilePath@b@ *            解压缩文件输出路径@b@ * @return 0:成功 1:失败+失败原因 (例如:1:要解压缩的文件不存在)@b@ */@b@public String unzipFile(String intputFilePath, String outputFilePath) {@b@String result = "0";@b@boolean b = isExists(intputFilePath);@b@if (!b) {@b@return "1:要解压缩的文件不存在";@b@} else {@b@File file = new File(outputFilePath);@b@if (!file.exists()) {@b@file.mkdirs();@b@}@b@File outFile = new File(outputFilePath);@b@if (!outFile.exists()) {@b@outFile.mkdirs();@b@}@b@unZip(outputFilePath, intputFilePath);@b@}@b@return result;@b@}@b@@b@/**@b@ * 解压缩文件对象.@b@ * @b@ * @param intputFile@b@ *            要解压缩的文件对象@b@ * @param outputFilePath@b@ *            解压缩文件输出路径@b@ * @return 0:成功 1:失败+失败原因 (例如:1:要解压缩的文件格式错误)@b@ */@b@public String unzipFile(File intputFile, String outputFilePath) {@b@String result = "0";@b@if (intputFile == null) {@b@return "1:要解压缩的文件不存在";@b@}@b@String inFileName = intputFile.getName();@b@String endName = inFileName.split("\\.")[1];@b@if (!endName.equals("zip")) {@b@result = "1:解压缩的文件格式错误";@b@} else {@b@File file = new File(outputFilePath);@b@if (!file.exists()) {@b@file.mkdirs();@b@}@b@String infile = intputFile.getAbsolutePath();@b@unZip(outputFilePath, infile);@b@result = "0";@b@}@b@return result;@b@}@b@@b@/**@b@ * 压缩文件.@b@ * @b@ * @param intputFilePath@b@ *            要压缩文件路径及文件名@b@ * @param outputFilePath@b@ *            压缩文件输出路径(压缩文件的命名为:原文件名+.zip后缀)@b@ * @return 0:成功 1:失败+失败原因 (例如:1:要压缩的文件不存在)@b@ */@b@public String zipFile(String intputFilePath, String outputFilePath) {@b@String result = "0";@b@boolean b = isExists(intputFilePath);@b@if (b) {@b@File file = new File(intputFilePath);@b@result = zipFile(file, outputFilePath);@b@} else {@b@result = "1:要压缩的文件不存在";@b@}@b@return result;@b@}@b@@b@public String zipFile(String intputFilePath, String outputFilePath,@b@String name) {@b@String result = "0";@b@boolean b = isExists(intputFilePath);@b@if (b) {@b@File file = new File(intputFilePath);@b@result = zipFile(file, outputFilePath, name);@b@} else {@b@result = "1:要压缩的文件不存在";@b@}@b@return result;@b@}@b@@b@/**@b@ * 压缩文件对象.@b@ * @b@ * @param intputFile@b@ *            要压缩的文件对象@b@ * @param outputFilePath@b@ *            压缩文件输出路径(压缩文件的命名为:原文件名+.zip后缀)@b@ * @return 0:成功 1:失败+失败原因 (例如:1:要压缩的文件不存在)@b@ */@b@public String zipFile(File intputFile, String outputFilePath) {@b@String result = "0";@b@if (intputFile == null) {@b@result = "1:要压缩的文件不存在";@b@} else {@b@File outfile = new File(outputFilePath);@b@if (!outfile.exists()) {@b@outfile.mkdirs();@b@}@b@String fileName = intputFile.getName();@b@@b@String tempFile = "/" + FileUtils.getFileNameWithoutType(fileName)@b@+ ".zip";@b@outputFilePath += tempFile;@b@String indirectory = intputFile.getAbsolutePath();@b@zip(indirectory, outputFilePath);@b@return result;@b@}@b@return result;@b@}@b@@b@public String zipFile(File intputFile, String outputFilePath, String name) {@b@String result = "0";@b@if (intputFile == null) {@b@result = "1:要压缩的文件不存在";@b@} else {@b@File outfile = new File(outputFilePath);@b@if (!outfile.exists()) {@b@outfile.mkdirs();@b@}@b@@b@String tempFile = name + ".zip";@b@outputFilePath += tempFile;@b@String indirectory = intputFile.getAbsolutePath();@b@zip(indirectory, outputFilePath);@b@return result;@b@}@b@return result;@b@}@b@@b@/**@b@ * 解密文件.@b@ * @b@ * @param intputFilePath@b@ *            要解密文件路径及文件名@b@ * @param outputFilePath@b@ *            解密文件输出路径@b@ * @param prikeyPath@b@ *            私钥文件路径@b@ * @return 0:成功 1:失败+失败原因 (例如:1:要解密的文件不存在)@b@ */@b@public String decryptFile(String intputFilePath, String outputFilePath,@b@String prikeyPath) {@b@String result = "0";@b@boolean b = isExists(intputFilePath);@b@if (!b) {@b@return "1:要解密的文件不存在";@b@}@b@File file = new File(outputFilePath);@b@if (!file.exists()) {@b@file.mkdirs();@b@}@b@File temp = new File(intputFilePath);@b@@b@outputFilePath += "/" + temp.getName();@b@try {@b@decrypt(intputFilePath, outputFilePath, getKey(prikeyPath));@b@} catch (Exception e) {@b@e.printStackTrace();@b@}@b@return result;@b@}@b@@b@/**@b@ * 解密文件对象.@b@ * @b@ * @param intputFile@b@ *            解密的文件对象@b@ * @param outputFilePath@b@ *            解密文件输出路径@b@ * @param prikeyPath@b@ *            私钥文件路径@b@ * @return 0:成功 1:失败+失败原因 (例如:1:要解密的文件不存在)@b@ */@b@public String decryptFile(File intputFile, String outputFilePath,@b@String prikeyPath) {@b@String result = "0";@b@if (intputFile == null) {@b@return "1:要解密的文件不存在";@b@}@b@File file = new File(outputFilePath);@b@if (!file.exists()) {@b@file.mkdirs();@b@}@b@String inFile = intputFile.getAbsolutePath();@b@String inName = intputFile.getName();@b@@b@outputFilePath += "/" + inName;@b@try {@b@decrypt(inFile, outputFilePath, getKey(prikeyPath));@b@} catch (Exception e) {@b@e.printStackTrace();@b@}@b@return result;@b@}@b@@b@/**@b@ * 加密文件.@b@ * @b@ * @param intputFilePath@b@ *            要加密文件路径及文件名@b@ * @param outputFilePath@b@ *            加密文件输出路径(加密文件的命名为:原文件名)@b@ * @param pubkeyPath@b@ *            公钥文件路径@b@ * @return 0:成功 1:失败+失败原因 (例如:1:要加密的文件不存在)@b@ */@b@public String encryptFile(String intputFilePath, String outputFilePath,@b@String pubkeyPath) {@b@String result = "0";@b@boolean b = isExists(intputFilePath);@b@if (!b) {@b@return "1:要加密的文件不存在";@b@} else {@b@File file = new File(outputFilePath);@b@if (!file.exists()) {@b@file.mkdirs();@b@}@b@File tempfile = new File(intputFilePath);@b@@b@outputFilePath += "/" + tempfile.getName();@b@try {@b@encrypt(intputFilePath, outputFilePath, getKey(pubkeyPath));@b@} catch (Exception e) {@b@e.printStackTrace();@b@}@b@}@b@return result;@b@}@b@@b@/**@b@ * 加密文件对象.@b@ * @b@ * @param intputFile@b@ *            要加密的文件对象@b@ * @param outputFilePath@b@ *            加密文件输出路径(加密文件的命名为:原文件名)@b@ * @param pubkeyPath@b@ *            公钥文件路径@b@ * @return 0:成功 1:失败+失败原因 (例如:1:要加密的文件不存在)@b@ */@b@public String encryptFile(File intputFile, String outputFilePath,@b@String pubkeyPath) {@b@String result = "0";@b@if (intputFile == null) {@b@return "1:要加密的文件不存在";@b@} else {@b@File file = new File(outputFilePath);@b@if (!file.exists()) {@b@file.mkdirs();@b@}@b@String inpath = intputFile.getAbsolutePath();@b@@b@outputFilePath += "/" + intputFile.getName();@b@@b@try {@b@encrypt(inpath, outputFilePath, getKey(pubkeyPath));@b@} catch (Exception e) {@b@e.printStackTrace();@b@}@b@}@b@return result;@b@}@b@@b@/**@b@ * 判断文件是否存在@b@ * @b@ * @param inputFilePath@b@ * @return@b@ */@b@private boolean isExists(String inputFilePath) {@b@boolean b = false;@b@File tempfile = new File(inputFilePath);@b@if (tempfile.exists()) {@b@b = true;@b@}@b@return b;@b@}@b@@b@/**@b@ * 目录压缩@b@ * @b@ * @param out@b@ * @param f@b@ * @param base@b@ * @throws Exception@b@ */@b@private void directoryZip(ZipOutputStream out, File f, String base)@b@throws Exception {@b@if (f.isDirectory()) {@b@File[] fl = f.listFiles();@b@out.putNextEntry(new ZipEntry(base + "/"));@b@if (base.length() == 0) {@b@base = "";@b@} else {@b@base = base + "/";@b@}@b@for (int i = 0; i @b@ * 例子: ZipEncrypt.getKey("E:/keypath/private.key");@b@ * @b@ * @param keyPath@b@ * @return key@b@ */@b@private Key getKey(String keyPath) throws Exception {@b@Key key = null;@b@FileInputStream fis = new FileInputStream(keyPath);@b@ObjectInputStream ofs = new ObjectInputStream(fis);@b@key = (Key) ofs.readObject();@b@ofs.close();@b@fis.close();@b@return key;@b@}@b@@b@/**@b@ * 把文件srcFile加密后存储为destFile@b@ * @b@ * @param srcFile@b@ * @param destFile@b@ * @param privateKey@b@ * @throws Exception@b@ */@b@private void encrypt(String srcFile, String destFile, Key privateKey)@b@throws Exception {@b@Cipher cipher = Cipher.getInstance("RSA");@b@cipher.init(Cipher.ENCRYPT_MODE, privateKey);@b@FileInputStream fis = new FileInputStream(srcFile);@b@FileOutputStream fos = new FileOutputStream(destFile);@b@byte[] b = new byte[53];@b@while (fis.read(b) != -1) {@b@fos.write(cipher.doFinal(b));@b@}@b@fos.close();@b@fis.close();@b@}@b@@b@/**@b@ * 把文件srcFile解密后存储为destFile@b@ * @b@ * @param srcFile@b@ * @param destFile@b@ * @param privateKey@b@ * @throws Exception@b@ */@b@private void decrypt(String srcFile, String destFile, Key privateKey)@b@throws Exception {@b@Cipher cipher = Cipher.getInstance("RSA");@b@cipher.init(Cipher.DECRYPT_MODE, privateKey);@b@FileInputStream fis = new FileInputStream(srcFile);@b@FileOutputStream fos = new FileOutputStream(destFile);@b@byte[] b = new byte[64];@b@while (fis.read(b) != -1) {@b@fos.write(cipher.doFinal(b));@b@}@b@fos.close();@b@fis.close();@b@}@b@@b@/**@b@ * 对byte数组进行加密@b@ * @b@ * @param input@b@ * @param keyPath@b@ * @return@b@ * @throws Exception@b@ */@b@public byte[] encryptByte(byte[] input, String pubKeyPath) {@b@try {@b@byte[] result = null;@b@Cipher cipher = Cipher.getInstance("RSA");@b@cipher.init(Cipher.ENCRYPT_MODE, (PublicKey) getKey(pubKeyPath));@b@ByteArrayInputStream in = new ByteArrayInputStream(input);@b@ByteArrayOutputStream baos = new ByteArrayOutputStream();@b@byte[] b = new byte[53];@b@while (in.read(b) != -1) {@b@baos.write(cipher.doFinal(b));@b@}@b@result = baos.toByteArray();@b@baos.close();@b@in.close();@b@return result;@b@} catch (Exception e) {@b@e.printStackTrace();@b@return null;@b@}@b@}@b@@b@/**@b@ * 对byte数组进行解密@b@ * @b@ * @param input@b@ * @param pubKeyPath@b@ * @return@b@ * @throws Exception@b@ */@b@public byte[] decryptByte(byte[] input, String priKeyPath) {@b@try {@b@byte[] result = null;@b@Cipher cipher = Cipher.getInstance("RSA");@b@cipher.init(Cipher.DECRYPT_MODE, (PrivateKey) getKey(priKeyPath));@b@ByteArrayInputStream in = new ByteArrayInputStream(input);@b@ByteArrayOutputStream baos = new ByteArrayOutputStream();@b@byte[] b = new byte[64];@b@while (in.read(b) != -1) {@b@baos.write(cipher.doFinal(b));@b@}@b@result = baos.toByteArray();@b@baos.close();@b@in.close();@b@return result;@b@} catch (Exception e) {@b@e.printStackTrace();@b@return null;@b@}@b@}@b@@b@/**@b@ * 对目录srcFile下的所有文件目录进行先压缩后加密,然后保存为destfile@b@ * @b@ * @param srcFile@b@ *            要操作的目录,如: "E:/srcFile"@b@ * @param destfile@b@ *            压缩加密后存放的文件名,如: "E:/destfile.zip"@b@ * @param keyfile@b@ *            公钥存放地点@b@ */@b@public void encryptZip(String srcFile, String destfile, String keyfile)@b@throws Exception {@b@File temp = new File(UUID.randomUUID().toString() + ".zip");@b@temp.deleteOnExit();@b@zip(srcFile, temp.getAbsolutePath());// 先压缩文件@b@encrypt(temp.getAbsolutePath(), destfile, publicKey);// 对文件加密@b@temp.delete();@b@}@b@@b@/**@b@ * 对文件srcfile进行先解密,然后解压缩到目录destfile下@b@ * @b@ * @param srcfile@b@ *            要解密和解压缩的文件名,如: "E:/srcfile.zip"@b@ * @param destfile@b@ *            解压缩后的目录,如: "E:/destfile"@b@ * @param publicKey@b@ *            公钥@b@ */@b@public void decryptUnzip(String srcfile, String destfile, Key publicKey)@b@throws Exception {@b@File temp = new File(UUID.randomUUID().toString() + ".zip");@b@temp.deleteOnExit();@b@decrypt(srcfile, temp.getAbsolutePath(), publicKey); // 先对文件解密@b@unZip(destfile, temp.getAbsolutePath());// 解压缩@b@temp.delete();@b@}@b@}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值