Java实现AES加密与解密(秘钥)

Java实现AES加密与解密(秘钥)

package com.company.example;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
 
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.security.SecureRandom;
 
/**
 * AES加密解密
 */
public class SecurityUtil {
 
	private static final Logger logger = LoggerFactory.getLogger(SecurityUtil.class);
	private static final String ENCODING = "UTF-8";
	private static final String PASSWORD = "46EBA22EF5204DD5B110A1F730513965"; // 加密秘钥
 
	/**
	 * AES加密
	 * @param content 明文
	 * @return 密文
	 */
	public static String encryptAES(String content) {
		if (StringUtil.isEmpty(content)) {
			throw new ParamException("明文不能为空!");
		}
		byte[] encryptResult = encrypt(content, PASSWORD);
		String encryptResultStr = parseByte2HexStr(encryptResult);
		// BASE64位加密
		encryptResultStr = ebotongEncrypto(encryptResultStr);
		return encryptResultStr;
	}
 
	/**
	 * AES解密
	 * @param encryptResultStr 密文
	 * @return 明文
	 */
	public static String decryptAES(String encryptResultStr) {
		if (StringUtil.isEmpty(encryptResultStr)) {
			throw new ParamException("密文不能为空");
		}
		// BASE64位解密
		try {
			String decrpt = ebotongDecrypto(encryptResultStr);
			byte[] decryptFrom = parseHexStr2Byte(decrpt);
			byte[] decryptResult = decrypt(decryptFrom, PASSWORD);
			return new String(decryptResult);
		} catch (Exception e) { // 当密文不规范时会报错,可忽略,但调用的地方需要考虑
			return null;
		}
	}
 
	/**
	 * 加密字符串
	 */
	private static String ebotongEncrypto(String str) {
		BASE64Encoder base64encoder = new BASE64Encoder();
		String result = str;
		if (str != null && str.length() > 0) {
			try {
				byte[] encodeByte = str.getBytes(ENCODING);
				result = base64encoder.encode(encodeByte);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		// base64加密超过一定长度会自动换行 需要去除换行符
		return result.replaceAll("\r\n", "").replaceAll("\r", "").replaceAll("\n", "");
	}
 
	/**
	 * 解密字符串
	 */
	private static String ebotongDecrypto(String str) {
		BASE64Decoder base64decoder = new BASE64Decoder();
		try {
			byte[] encodeByte = base64decoder.decodeBuffer(str);
			return new String(encodeByte);
		} catch (IOException e) {
			logger.error("IO 异常",e);
			return str;
		}
	}
 
	/**
	 * 加密
	 * @param content 需要加密的内容
	 * @param password 加密密码
	 * @return
	 */
	private static byte[] encrypt(String content, String password) {
		try {
			KeyGenerator kgen = KeyGenerator.getInstance("AES");
			// 注意这句是关键,防止linux下 随机生成key。用其他方式在Windows上正常,但Linux上会有问题
			SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
			secureRandom.setSeed(password.getBytes());
			kgen.init(128, secureRandom);
			// 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");// 创建密码器
			byte[] byteContent = content.getBytes("utf-8");
			cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
			byte[] result = cipher.doFinal(byteContent);
			return result; // 加密
		} catch (Exception e) {
			logger.error("加密异常", e);
		}
		return null;
	}
 
	/**
	 * 解密
	 * @param content 待解密内容
	 * @param password 解密密钥
	 * @return
	 */
	private static byte[] decrypt(byte[] content, String password) {
		try {
			KeyGenerator kgen = KeyGenerator.getInstance("AES");
			// 防止linux下 随机生成key
			SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
			secureRandom.setSeed(password.getBytes());
			kgen.init(128, secureRandom);
			// 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);
			return result; // 加密
		} catch (Exception e) {
			logger.error("解密异常", e);
		}
		return null;
	}
 
	/**
	 * 将二进制转换成16进制
	 * @param buf
	 * @return
	 */
	private static String parseByte2HexStr(byte buf[]) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < buf.length; i++) {
			String hex = Integer.toHexString(buf[i] & 0xFF);
			if (hex.length() == 1) {
				hex = '0' + hex;
			}
			sb.append(hex.toUpperCase());
		}
		return sb.toString();
	}
 
	/**
	 * 将16进制转换为二进制
	 * @param hexStr
	 * @return
	 */
	private static byte[] parseHexStr2Byte(String hexStr) {
		if (hexStr.length() < 1)
			return null;
		byte[] result = new byte[hexStr.length() / 2];
		for (int i = 0; i < hexStr.length() / 2; i++) {
			int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
			int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
			result[i] = (byte) (high * 16 + low);
		}
		return result;
	}
 
	public static void main(String[] args) {
		test();
	}
 
	/**
	 * 测试
	 */
	private static void test() {
		System.out.println("加密解密试试:");
		String content = "EXPRESS";
		System.out.println("原内容为:" + content);
		String encryContent = encryptAES(content);
		System.out.println("加密后的内容为:" + encryContent);
		String decryContent = decryptAES(encryContent);
		System.out.println("解密后的内容为:" + decryContent);
	}
 
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100046.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(2)


相关推荐

  • 记录使用Depix过程(小白文)

    记录使用Depix过程(小白文)Tips:本文仅用做探索记录(外行+新手),不保证正确性,慎读慎参考!背景:无聊看到一个可以去除马赛克的工具,并有GitHub源码(短短几天10K+star,lsp警告????,我反正不是,没跑过Python代码,一次尝试而已)。过程为本人第一视角,漏掉的部分请自行探索。下载源码,cd到根目录,执行文档(README.d)中的Example代码。到这里,目前还不明白这行代码的意思,不过可以看到两个图片路径,都在示例代码中出现,最后一个看名字就知道,工程根目录输出一个output.png图片。猜测为执

  • java将字符串转换为json对象的方法_java jsonobject转string

    java将字符串转换为json对象的方法_java jsonobject转string在与服务器交互的时候,我们往往会使用json字符串,今天的例子是java对象转化为字符串,代码如下protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Persionp1=newPersion(…

  • 无法连接服务器怎么办(原始服务器找不到目标资源)

    Tomcat启动成功访问404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。项目右键->Properties->JavaBuildPath->Libraries->addLibraries-选择要使用的tomcat版本查看了一下Tomcat文件夹中的webapps文件夹,发现里面并没有我的项目,但是我确实是把项目部署进去了,于是我查看…

  • ES6 Promise用法小结

    ES6 Promise用法小结目录1.什么是Promisereject的用法catch的用法all的用法race的用法1.什么是PromisePromise是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。Promise对象有以下两个特点。(1)对象的状态不受外界影响。Promise对象代表一个异步操…

  • 数列所有公式大全_splay树

    数列所有公式大全_splay树请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线 _ 表示实际输入文件中的空格)输入格式第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目。第 2 行包含 N 个数字,描述初始时的数列。以下 M 行,每行一条命令,格式参见问题描述中的表格。输出格式对于输入数据中的 GET-SUM 和 MAX-SUM 操作,向输出文件依次打印结果,每个答案(数字)占一行。数据范围与约定你可以认为在任何时刻,数列中至少有 1 个数。输入

  • java有哪些服务器_java服务器有哪些?

    java有哪些服务器_java服务器有哪些?java服务器有哪些?应用服务器主要为应用程序提供运行环境,为组件提供服务。Java的应用服务器很多,从功能上分为两大类,JSP服务器和JavaEE服务器,也可分其他小类。JSP服务器有Tomcat、BejyTiger、Geronimo、Jetty、Jonas、Jrun、Orion、Resin等等。JavaEE服务器有TongWeb、BESApplicati…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号