欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java AES 对称加密

程序员文章站 2022-03-12 22:25:36
...
package com.inspur.uc.util;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.inspur.uc.util.mail.Base64;

/**
 * AES 对称加密算法
 */
public class AESUtil {

	private static Log log = LogFactory.getLog(AESUtil.class);
	private static String aes_key_path = "aes.key";
	
	//加载**文件
	private static SecretKey privateKey = null;
	static{
		ObjectInputStream ois = null;
		try {
			InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(aes_key_path);
			ois = new ObjectInputStream(inputStream);
			privateKey = (SecretKey) ois.readObject();
		} catch (FileNotFoundException e) {
			log.error("未找到**文件:"+aes_key_path, e);
		} catch (IOException e) {
			log.error("读取**文件出错:"+aes_key_path, e);
		} catch (ClassNotFoundException e) {
			log.error(null, e);
		}finally{
			if(ois != null){
				try {
					ois.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 生成**并保存至文件中
	 * @param key
	 */
	private static void createKey() {
		try {
			//生成**
			KeyGenerator kgen = KeyGenerator.getInstance("AES");
			kgen.init(128, new SecureRandom());  
			SecretKey secretKey = kgen.generateKey();  
			
			//将**写入文件
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(aes_key_path));
			oos.writeObject(secretKey);
			System.out.println("ok");
		} catch (Exception e) {
			e.printStackTrace();
		}  
	}

	/**
	 * AES加密
	 * @param content
	 * @param key
	 * @return String
	 */
	public static String encode(String content, SecretKey key){
		try {
			Cipher cipher = Cipher.getInstance("AES");
			cipher.init(Cipher.ENCRYPT_MODE,key );
			byte[] b = cipher.doFinal(content.getBytes());
			return Base64.encodeBytes(b);
		} catch (Exception e) {
			log.error("加密失败:content="+content+",key="+key);
		}
		return null;
	}
	
	//使用**文件中的**进行加密解密
	public static String encode(String content){
		return encode(content,privateKey);
	}
	public static String decode(String miwen){
		return decode(miwen,privateKey);
	}

	/**
	 * AES解密
	 * @param miwen
	 * @param key
	 * @return String
	 */
	public static String decode(String miwen, SecretKey key){
		String str = null;
		try {
			Cipher cipher = Cipher.getInstance("AES");
			cipher.init(Cipher.DECRYPT_MODE, key);
			str = new String(cipher.doFinal(Base64.decode(miwen)));
		} catch (Exception e) {
			log.error("解密失败:content="+miwen+",key="+key);
		}
		return str;
	}
	public static void main(String[] args) {
		String yuanwen = "中国,山东123abc!@#¥%……&*(*()》《。,。、?测试";
		System.out.println("原文:"+yuanwen);
		String miwen = encode(yuanwen);
		System.out.println("密文:"+miwen);
		System.out.println("解密:"+decode(miwen));
	}
}

 输出结果:

原文:中国,山东123abc!@#¥%……&*(*()》《。,。、?测试
密文:AQPJKD3ycFbQE1ZcXinf8PVM1EMc3jqvQC+QwFcQu7UFeQSO2Javt0FCTl0CdJfx95ppi1W6vE/w
kI5s7TdUY+Rqrl4MLjBj+wf49kqOgN8=
解密:中国,山东123abc!@#¥%……&*(*()》《。,。、?测试

 

相关标签: 加密解密