【开发技术】对文件内容进行加密-java
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的更多相关文章
- java 实现文件内容的加密和解密
package com.umapp.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java ...
- iphone开发技术要学习的内容
一.iOS基础 1 开发环境搭建以及IOS组件.框架的概要介绍. 2 mac操作系统与iOS操作系统 3 xcode IDE开发环境的初始 二.C语言基础 1数据类型.表达式与控制流程语句 2数组.函 ...
- Java不走弯路教程(3.用户验证与文件内容查询)
3.用户验证与文件内容查询 在上一章中,我们完成了对指定文件内容的输出操作. 我们现在有如下格式的文件product.db id,product_name,product_detail 1,noteb ...
- 博主有偿带徒 《编程语言设计和实现》《MUD游戏开发》《软件破解和加密》《游戏辅助外挂》《JAVA开发》
<考研专题>操作系统原理 理论解答:8K 实战 1.5W CPU设计 理论解答:1W 实战 2.5W <编程语言设计和实现>初窥门径<5K>:编译原理.编译设计小试 ...
- Java EE开发技术课程第五周(Applet程序组件与AJAX技术)
1.Applet程序组件 1.1.定义: Applet是采用Java编程语言编写的小应用程序,该程序可以包含在HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同.含有Apple ...
- Java Web开发技术教程入门-JSP基本语法和九大内置对象
这两天气温逐渐升高,好想把自己泡在冰块里······ 恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽.......今天阅读到了这本书的第四章-JSP基本语法.经过第一天的阅读,我们明白JSP技术是Java Web开 ...
- Java Web开发技术教程入门-静态网页技术
昨天了解了构建动态网站的几种技术:Servlet技术.JSP技术,ASP技术和ASP.NET技术以及PHP技术.昨天的精髓在于JSP技术的运行原理:通过用户请求JSP文件,首先检查JSP文件的 ...
- 五种方式让你在java中读取properties文件内容不再是难题
一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...
- java swing文件内容检索工具
Java相关技术 - 文件内容检索工具 拿到一个几百M甚至上G的project让你去学习 有时候你会想知道某个关键词是在哪个文件里 比如:spring MVC配置的@RequestMapping,你从 ...
随机推荐
- Django__WSGI
WEB应用的本质 : 1. 浏览器发送一个http请求 2. 服务器收到请求,生成一个html文档 3. 服务器把HTML文档作为HTTP响应的body发送给浏览器 4. 浏览器收到http响应,从h ...
- thinkinginjava学习笔记09_内部类
定义与创建 将一个类定义放在另一个类.方法.作用域.匿名类等地方,就是内部类:内部类只能由外部类对象创建(通过外部方法或者.new方法),内部类对象创建时必须已经有一个外部类对象,并且与之连接(在内部 ...
- SQL基础学习_01_数据库和表
SQL语句及其种类 1. SQL语句分为三类: DDL(Data Definition Language): CREATE.DROP.ALTER; DML(Data Manipulat ...
- Javascript流程控制
Javascript流程控制 1.条件语句 (1)if(exp)执行一句代码 (2)if(exp){执行代码段;} (3)if(exp){exp为true执行代码段}else{exp为false执行的 ...
- robotframework的学习笔记(十三)------Robot Framework常用库简介
标准库 Robot Framework可以直接导入使用的库,包括: Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式 ...
- [js高手之路]html5 canvas动画教程 - 跟着鼠标移动消失的一堆炫彩小球
综合利用前面所学,实现一个绚丽的小球动画,这个实例用到的知识点,在我的博客全部都有,可以去这里查看所有的canvas教程 <head> <meta charset='utf-8' / ...
- C#设计模式之一单例模式(Singleton Pattern)【创建型】
一.引言 看了李建忠老师的讲的设计模式已经有一段时间了(这段时间大概有一年多了),自己还没有写过自己的.有关设计模式的文章.这次想写一些关于设计模式的文章,用自己的理解和代码来写,算是复习一遍 ...
- IE下javascript cookie path设置Bug
项目中设置完cookie,在Firefox下顺利测试通过.IE测试出现问题,经定位发现是Javascript设置 Cookie 时的 path 有问题.IE下Cookie设置在 /或者URL所在路径时 ...
- 【APS.NET 框架系列】浅谈ASP.NET 框架
本篇文章稍微偏原理且底层,有一定难度和且比较晦涩. 本篇文章主要是从广度上概括一下,具体的更细粒度的,会在后续的文章中,结合具体的Demo实例分析. 一 .NET框架概述 1.作用:提供了基于. ...
- C#中yield的使用
yield 关键字向编译器指示它所在的方法是迭代器块.编译器生成一个类来实现迭代器块中表示的行为.在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值.这是一个返回值, ...