对文件内容进行加密

实现效果:对文件内容进行加密,使之直接打开成为乱码,不以明文显示

 

实现步骤:1.key.txt里面存放的是加密文件的密码,这个是明文

                 2.源文件加密后,加密后的文件如果是压缩包必须通过程序解密后,方可打开,直接用软件是打不开加密后的压缩文件(此处需要注意一下,例如:将test.txt加密压缩后成为新的文件test.rar,test.rar必须通过程序解密后,才能用软件打开,如果直接打开test.rar是不行的)

                3.已经测试,方案可行,详情请参见代码:

实现代码如下:

package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.SecureRandom;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * 对文件加密/解密和压缩/解压缩对象类
 */
public class test {
 public static void main(String args[]) throws Exception{
  //自定义压缩方式
  String srcFile = "c://test.rar";//源文件
  String destFile = "c://test1.rar";//加密后文件
  Key privateKey = new test().getKey("c://key.txt");//存放解密密码
  new test().encrypt(srcFile, destFile, privateKey);//加密压缩文件(压缩后的文件必须通过程序解密才能打开)
  new test().decrypt(destFile, "c://text2.rar", privateKey);//解密压缩文件
 }
 
 private void directoryZip(ZipOutputStream out, File f, String base)
   throws Exception {
  // 如果传入的是目录
  if (f.isDirectory()) {
   File[] fl = f.listFiles();
   // 创建压缩的子目录
   out.putNextEntry(new ZipEntry(base + "/"));
   if (base.length() == 0) {
    base = "";
   } else {
    base = base + "/";
   }
   for (int i = 0; i < fl.length; i++) {
    directoryZip(out, fl[i], base + fl[i].getName());
   }
  } else {
   // 把压缩文件加入rar中
   out.putNextEntry(new ZipEntry(base));
   FileInputStream in = new FileInputStream(f);
   byte[] bb = new byte[2048];
   int aa = 0;
   while ((aa = in.read(bb)) != -1) {
    out.write(bb, 0, aa);
   }
   in.close();
  }
 }

 /**
  * 压缩文件
  * 
  * @param zos
  * @param file
  * @throws Exception
  */
 private void fileZip(ZipOutputStream zos, File file) throws Exception {
  if (file.isFile()) {
   zos.putNextEntry(new ZipEntry(file.getName()));
   FileInputStream fis = new FileInputStream(file);
   byte[] bb = new byte[2048];
   int aa = 0;
   while ((aa = fis.read(bb)) != -1) {
    zos.write(bb, 0, aa);
   }
   fis.close();
   System.out.println(file.getName());
  } else {
   directoryZip(zos, file, "");
  }
 }

 /**
  * 解压缩文件
  * 
  * @param zis
  * @param file
  * @throws Exception
  */
 private void fileUnZip(ZipInputStream zis, File file) throws Exception {
  ZipEntry zip = zis.getNextEntry();
  if (zip == null)
   return;
  String name = zip.getName();
  File f = new File(file.getAbsolutePath() + "/" + name);
  if (zip.isDirectory()) {
   f.mkdirs();
   fileUnZip(zis, file);
  } else {
   f.createNewFile();
   FileOutputStream fos = new FileOutputStream(f);
   byte b[] = new byte[2048];
   int aa = 0;
   while ((aa = zis.read(b)) != -1) {
    fos.write(b, 0, aa);
   }
   fos.close();
   fileUnZip(zis, file);
  }
 }

 /**
  * 对directory目录下的文件压缩,保存为指定的文件zipFile
  * 
  * @param directory
  * @param zipFile
  */
 private void zip(String directory, String zipFile) {
  try {
   ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
     zipFile));
   fileZip(zos, new File(directory));
   zos.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 解压缩文件zipFile保存在directory目录下
  * 
  * @param directory
  * @param zipFile
  */
 private void unZip(String directory, String zipFile) {
  try {
   ZipInputStream zis = new ZipInputStream(
     new FileInputStream(zipFile));
   File f = new File(directory);
   f.mkdirs();
   fileUnZip(zis, f);
   zis.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 根据key的路径文件获得持久化成文件的key
  * <P>
  * 例子: RsaEncrypt.getKey("c:/systemkey/private.key");
  * 
  * @param keyPath
  * @return
  */
 private Key getKey(String keyPath) throws Exception {
  FileInputStream fis = new FileInputStream(keyPath);
  byte[] b = new byte[16];
  fis.read(b);
  SecretKeySpec dks = new SecretKeySpec(b, "AES");
  fis.close();
  return dks;
 }

 /**
  * 把文件srcFile加密后存储为destFile
  * 
  * @param srcFile
  * @param destFile
  */
 private void encrypt(String srcFile, String destFile, Key privateKey)
   throws Exception {
  SecureRandom sr = new SecureRandom();
  Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  IvParameterSpec spec = new IvParameterSpec(privateKey.getEncoded());
  cipher.init(Cipher.ENCRYPT_MODE, privateKey, spec, sr);
  FileInputStream fis = new FileInputStream(srcFile);
  FileOutputStream fos = new FileOutputStream(destFile);
  byte[] b = new byte[2048];
  while (fis.read(b) != -1) {
   fos.write(cipher.doFinal(b));
  }
  fos.close();
  fis.close();
 }

 /**
  * 把文件srcFile解密后存储为destFile
  * 
  * @param srcFile
  * @param destFile
  * @param privateKey
  * @throws Exception
  */
 private void decrypt(String srcFile, String destFile, Key privateKey)
   throws Exception {
  SecureRandom sr = new SecureRandom();
  Cipher ciphers = Cipher.getInstance("AES/CBC/PKCS5Padding");
  IvParameterSpec spec = new IvParameterSpec(privateKey.getEncoded());
  ciphers.init(Cipher.DECRYPT_MODE, privateKey, spec, sr);
  FileInputStream fis = new FileInputStream(srcFile);
  FileOutputStream fos = new FileOutputStream(destFile);
  byte[] b = new byte[2064];
  while (fis.read(b) != -1) {
   fos.write(ciphers.doFinal(b));
  }
  fos.close();
  fis.close();
 }

 /**
  * 对目录srcFile下的所有文件目录进行先压缩后操作,然后保存为destfile
  * 
  * @param srcFile
  *            要操作的目录 如c:/test/test
  * @param destfile
  *            压缩加密后存放的文件名 如c:/加密压缩文件.zip
  * @param keyfile
  *            公钥存放地点
  */
 public void encryptZip(String srcFile, String destfile, String keyfile)
   throws Exception {
  SecureRandom sr = new SecureRandom();
  KeyGenerator kg = KeyGenerator.getInstance("AES");
  kg.init(128, sr);
  SecretKey key = kg.generateKey();
  File f = new File(keyfile);
  if (!f.getParentFile().exists())
   f.getParentFile().mkdirs();
  f.createNewFile();
  FileOutputStream fos = new FileOutputStream(f);
  fos.write(key.getEncoded());
  File temp = new File(UUID.randomUUID().toString() + ".zip");
  temp.deleteOnExit();
  // 先压缩文件
  zip(srcFile, temp.getAbsolutePath());
  // 对文件加密
  encrypt(temp.getAbsolutePath(), destfile, key);
  temp.delete();
 }

 /**
  * 对文件srcfile进行先解密后解压缩,然后解压缩到目录destfile下
  * 
  * @param srcfile
  *            要解密和解压缩的文件名 如c:/目标.zip
  * @param destfile
  *            解压缩后的目录 如c:/abc
  * @param publicKey
  *            公钥
  */
 public void decryptUnzip(String srcfile, String destfile, String keyfile)
   throws Exception {
  // 先对文件解密
  File temp = new File(UUID.randomUUID().toString() + ".zip");
  temp.deleteOnExit();
  decrypt(srcfile, temp.getAbsolutePath(), this.getKey(keyfile));
  // 解压缩
  unZip(destfile, temp.getAbsolutePath());
  temp.delete();
 }
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值