AES加密解密简单实例

原创 2015年11月18日 11:03:51
package cn.com.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * 加密压缩文件,解密压缩文件工具类
 * @author max
 *
 */
public class AESlockUtil {
	/**
	 * 文件读取缓冲区大小 
	 */
	private static final int CACHE_SIZE = 1024;
	
	public static void main(String[] args) throws Exception {
		jiami();
		jiemi();

	}
	/**
	 * 加密
	 * @param content 需要加密的内容
	 * @param password  加密密码
	 * @return
	 */ 
	public static byte[] encrypt(byte[] content, String password) { 
		try {    
			//long startTime=System.currentTimeMillis();
			KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
			kgen.init(128, new SecureRandom(password.getBytes())); 
			SecretKey secretKey = kgen.generateKey(); 
			byte[] enCodeFormat = secretKey.getEncoded(); 
			SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); 
			Cipher cipher = Cipher.getInstance("AES");// 创建密码器 
			cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 
			byte[] result = cipher.doFinal(content); 
			//long endTime=System.currentTimeMillis();
			//System.out.println("加密时间: "+(endTime-startTime)+"ms");
			return result; 
		} catch (NoSuchAlgorithmException e) { 
			e.printStackTrace(); 
		} catch (NoSuchPaddingException e) { 
			e.printStackTrace(); 
		} catch (InvalidKeyException e) { 
			e.printStackTrace(); 
		} catch (IllegalBlockSizeException e) { 
			e.printStackTrace(); 
		} catch (BadPaddingException e) { 
			e.printStackTrace(); 
		} 
		return null; 
	} 

	/**解密
	 * @param content  待解密内容
	 * @param password 解密密钥
	 * @return
	 */ 
	public static byte[] decrypt(byte[] content, String password) { 
		try { 
			//long startTime=System.currentTimeMillis();
			KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
			kgen.init(128, new SecureRandom(password.getBytes())); 
			SecretKey secretKey = kgen.generateKey(); 
			byte[] enCodeFormat = secretKey.getEncoded(); 
			SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");             
			Cipher cipher = Cipher.getInstance("AES");// 创建密码器 
			cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 
			byte[] result = cipher.doFinal(content); 
			//long endTime=System.currentTimeMillis();
			// System.out.println("解密时间: "+(endTime-startTime)+"ms");
			return result; 
		} catch (NoSuchAlgorithmException e) { 
			e.printStackTrace(); 
		} catch (NoSuchPaddingException e) { 
			e.printStackTrace(); 
		} catch (InvalidKeyException e) { 
			e.printStackTrace(); 
		} catch (IllegalBlockSizeException e) { 
			e.printStackTrace(); 
		} catch (BadPaddingException e) { 
			e.printStackTrace(); 
		} 
		return null; 
	}

	/**
	 * 加密测试方法
	 * 加密后的文件放在源文件同一目录下
	 */
	public static void jiami() throws Exception{
		//压缩包文件转byte
		byte[] zipByte = fileToByte("D:/aaa/4028cb2450fa422a0150ff63da6b004f.rar");
		//加密
		String password = "123qwe!@#";//加密密码
		//加密后的byte数组
		byte[] encryptResult = encrypt(zipByte, password);
		//如果加密成功形成了加密后的数组,就删除原有的压缩文件
		if(encryptResult.length!=0){
			//压缩包文件路径
			File folder = new File("D:/aaa");
			File[] files =folder.listFiles();
			//遍历整个文件夹
			for(File file:files){
 				//如果是加密之前的文件就删除
				if(file.getName().equals("4028cb2450fa422a0150ff63da6b004f.rar")){
					file.delete();
				}
			}
		}
		//读取加密后的文件
		ByteArrayInputStream arrin =new ByteArrayInputStream(encryptResult);
		//文件输出流
		FileOutputStream out = new FileOutputStream("D:/aaa/4028cb2450fa422a0150ff63da6b004f.rar");
		byte[] bytes = new byte[1024];
		int len = 0;
		while((len=arrin.read(bytes))!=-1){
			//写入加密后的内容
			out.write(bytes,0,len);
		}
		out.close();
		arrin.close();
	}
	/**
	 * 解密测试方法
	 * 解密后的文件存放在解密前统一路径下
	 */
	public static void jiemi() throws Exception{
		//文件转byte数组
		byte[] content = fileToByte("D:/aaa/4028cb2450fa422a0150ff63da6b004f.rar");
		//解密密码
		String password = "123qwe!@#";
		//解密后的byte数组
		byte[] decryptResult = decrypt(content,password); 
		//如果解密成功形成了解密后的数组,就删除原有的压缩文件
		if(decryptResult.length!=0){
			//压缩包文件路径
			File folder = new File("D:/aaa");
			File[] files =folder.listFiles();
			//遍历整个文件夹
			for(File file:files){
				//如果是解密之前的文件就删除
				if(file.getName().equals("4028cb2450fa422a0150ff63da6b004f.rar")){
					file.delete();
				}
			}
		}
		//读取解密后的文件
		ByteArrayInputStream arrin =new ByteArrayInputStream(decryptResult);
		//输出文件流
		FileOutputStream output = new FileOutputStream("D:/aaa/4028cb2450fa422a0150ff63da6b004f.rar");
		byte[] bytes = new byte[1024];
		int len = 0;
		while((len=arrin.read(bytes))!=-1){
			//写入解密后的文件内容
			output.write(bytes,0,len);
		}
		output.close();
		arrin.close();
	}
	/**
	 * 文件转换为二进制数组
	 * @param filePath
	 * @return
	 * @throws Exception
	 */
	public static byte[] fileToByte(String filePath) throws Exception {
		byte[] data = new byte[0];
		File file = new File(filePath);
		if (file.exists()) {
			FileInputStream in = new FileInputStream(file);
			ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
			byte[] cache = new byte[CACHE_SIZE];
			int nRead = 0;
			while ((nRead = in.read(cache)) != -1) {
				out.write(cache, 0, nRead);
				out.flush();
			}
			out.close();
			in.close();
			data = out.toByteArray();
		}
 		return data;
	}
}


相关文章推荐

ocx中对称密钥加密解密的简单实例

//------------------------------------------------------------------#define _WIN32_WINNT 0x0400#incl...

aes加密解密代码

  • 2015年04月15日 14:24
  • 17KB
  • 下载

JAVA AES加密解密

  • 2015年07月30日 20:45
  • 6KB
  • 下载

java和js实现aes加密解密

由于公司安全测试,要对重要信息进行加密传输,使得java、android、ios一致。 java代码 package gov.communitycloud.user.utils; import ...

AES加密解密

  • 2017年08月19日 09:16
  • 7.9MB
  • 下载

cryptoJS加密解密aes 方式

  • 2017年11月08日 19:10
  • 185KB
  • 下载

关于Android中使用AES加密解密的问题

当你百度java怎么进行aes加密、解密时,会百度到很多这样的代码 代码一(部分): public static String encode(String key, String src) thr...
  • yyc_god
  • yyc_god
  • 2015年10月09日 09:10
  • 356

java和js实现aes加密解密(含CryptoJS)

  • 2017年10月30日 14:08
  • 165KB
  • 下载

文件的加密解密(AES)

  • 2016年01月06日 19:58
  • 3.05MB
  • 下载

Base64、MD5、DES、AES、RAS加密解密编码解码分析

概念: 编码 解码  防止中文乱码 加密 解密  安全性  将明文---密文(看不懂) Base64   概念:Base64编码可用于在HTTP环境下传递较长的标识信息 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AES加密解密简单实例
举报原因:
原因补充:

(最多只允许输入30个字)