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;
	}
}


AES加密解密详解

一)什么是AES?高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。那么...
  • xiejunxing
  • xiejunxing
  • 2016年11月28日 09:53
  • 5615

加密解密 AES

转 /** * AES加密解密 */ public class AesUtils { /** * 加密--把加密后的byte数组先进行二进制转16进制在...
  • b45bobo
  • b45bobo
  • 2018年01月08日 15:27
  • 71

Android中 MD5、RC4、DES、DESede (3DES)、RSA、AES、自定义填充方式的 AES加密/解密算法

/** * 字符串进行加密 */ public static String useMD5(String passWord) { try { ...
  • qq_34947883
  • qq_34947883
  • 2018年01月19日 09:37
  • 21

Android中AES加密和解密

/** * deEncryption method. * * @param data * @param key * @param iv * ...
  • student9128
  • student9128
  • 2017年03月31日 20:27
  • 542

【加密解密】-AES加密解密实现

先看实现效果,测试代码如下:package org.iti.algorithm;public class AESDemo { public static void main(String[] a...
  • tailyou
  • tailyou
  • 2015年08月27日 14:24
  • 3168

JAVA实现AES加密和解密

经过三周的不懈努力,终于完成了AES对文件的加密和解密。现在将自己的学习经历记下来,纪念自己三周的付出。同时也感谢网上的各位大神的博客。 AES对文件加密和解密以及打包的工具:http://downl...
  • xiaaiwu
  • xiaaiwu
  • 2015年01月15日 20:21
  • 3104

Javascript实现前端AES加密解密功能

js前端AES加密 最近由于项目需求做了一次MITM,突然即使发现使用HTTPS,也不能保证数据传输过程中的安全性。 通过中间人攻击,可以直接获取到Http协议的所有内容。 于是开始尝试做一...
  • u012118993
  • u012118993
  • 2017年05月21日 10:31
  • 11218

Android传输数据时Aes加密解密详解

Android传输数据时Aes加密解密详解
  • binjianliu
  • binjianliu
  • 2017年09月07日 09:04
  • 269

javascript利用AES加密及解密

index.html
  • java_wisely
  • java_wisely
  • 2013年07月26日 10:38
  • 1962

js版aes加解密实例

详细代码见如下网址:https://code.csdn.net/u013372487/aes_encryption_and_decryption/tree/master...
  • u013372487
  • u013372487
  • 2016年06月07日 14:12
  • 3843
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AES加密解密简单实例
举报原因:
原因补充:

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