http://hi.baidu.com/java0804ms/item/111ea834fbd4d2f596f88d5a

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

实现步骤: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(); } }

【开发技术】对文件内容进行加密-java的更多相关文章

  1. java 实现文件内容的加密和解密

    package com.umapp.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java ...

  2. iphone开发技术要学习的内容

    一.iOS基础 1 开发环境搭建以及IOS组件.框架的概要介绍. 2 mac操作系统与iOS操作系统 3 xcode IDE开发环境的初始 二.C语言基础 1数据类型.表达式与控制流程语句 2数组.函 ...

  3. Java不走弯路教程(3.用户验证与文件内容查询)

    3.用户验证与文件内容查询 在上一章中,我们完成了对指定文件内容的输出操作. 我们现在有如下格式的文件product.db id,product_name,product_detail 1,noteb ...

  4. 博主有偿带徒 《编程语言设计和实现》《MUD游戏开发》《软件破解和加密》《游戏辅助外挂》《JAVA开发》

    <考研专题>操作系统原理 理论解答:8K 实战 1.5W CPU设计 理论解答:1W 实战 2.5W <编程语言设计和实现>初窥门径<5K>:编译原理.编译设计小试 ...

  5. Java EE开发技术课程第五周(Applet程序组件与AJAX技术)

    1.Applet程序组件 1.1.定义: Applet是采用Java编程语言编写的小应用程序,该程序可以包含在HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同.含有Apple ...

  6. Java Web开发技术教程入门-JSP基本语法和九大内置对象

    这两天气温逐渐升高,好想把自己泡在冰块里······ 恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽.......今天阅读到了这本书的第四章-JSP基本语法.经过第一天的阅读,我们明白JSP技术是Java Web开 ...

  7. Java Web开发技术教程入门-静态网页技术

        昨天了解了构建动态网站的几种技术:Servlet技术.JSP技术,ASP技术和ASP.NET技术以及PHP技术.昨天的精髓在于JSP技术的运行原理:通过用户请求JSP文件,首先检查JSP文件的 ...

  8. 五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  9. java swing文件内容检索工具

    Java相关技术 - 文件内容检索工具 拿到一个几百M甚至上G的project让你去学习 有时候你会想知道某个关键词是在哪个文件里 比如:spring MVC配置的@RequestMapping,你从 ...

随机推荐

  1. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug

    前言: 话说昨晚还是前晚,写了一篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上) 文章写到最后时,多了很多莫名奇妙的问题!!! 为了解决了这些莫名奇妙的问题,我又战斗了2 ...

  2. react-native-scrollable-tab-view组件的简单使用

    react-native-scrollable-tab-view是一个滑动tab组件,可在tab之间进行切换显示内容 https://github.com/skv-headless/react-nat ...

  3. css3实现图片旋转效果

    css3实现图片旋转效果 近期实现一个消息提醒(醒目)的需求页面.想到了css3的旋转动画,故使用. =============== 鼠标悬浮时候,图片可以旋转,放大 rotate(360deg) s ...

  4. 大话python模块与包

    前言 眼看着老掌门年纪越来越大,掌门之位的传承也成了门派中的一件大事.这天,老掌门把小掌门叫到跟前,语重心长地说道:孩子啊,以后你就要继任掌门之位了,我就传授此生所学的绝世功法与你,以后可要悉心学习, ...

  5. echart(2),模拟数据导入篇

    先上图,就是介样子的: 所模拟的效果就是讲左下角的li里面的数据取出来,然后用环形图的展示出数据. 看代码截图: 1.总的框架图: 2.循环取数据的js代码: 3.echart提供额官方api的代码 ...

  6. MYSQL:插入记录检查记录是否存在,存在则更新,不存在测插入记录SQL

    我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...

  7. 从蓝光到4K,腾讯视频高码率下载背后的技术

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 由 腾讯技术工程官方号 发布在云+社区 蓝光和4k视频正逐渐普及,4K视频峰值码率超10Mbit/s.架构平台部TVideo平台从资源,链路.缓 ...

  8. Array对象的方法详情

    题外话:从事前端开发有很长一段时间了,一直在不断的扩充各种框架的学习,总觉得要学的东西好多,但是技能并没有得到很大的提升,后发现自己一味去追求的它的广度,并没用去深究其深度,所以决定打算从零开始,从最 ...

  9. python机器学习工具包

    1. scikit-learn: Machine Learning in Python scikit-learn是一个基于NumPy, SciPy, Matplotlib的开源机器学习工具包,主要涵盖 ...

  10. cain使用方法

    首先安装cain,这里就不废话了 1, 选择中核弹标志左边的按一下,然后在sniffer右键点击第一个扫描内网所有ip 扫描完后选择网关的IP下面选择arp标志,在按一下上方空格处,+号变得可以使用了 ...