AES对称加密工具类,拿来即用!
平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~
AES对称加密
1 AES对称加密简介
高级加密标准(AES,Advanced Encryption Standard):是最常见的对称加密算法(对称加密算法就是加密和解密用相同的密钥)。广泛应用于各种加密传输报文中,如:微信解密获取用户手机号,报文加密传输等。
对称加密不同于信息摘要(MD5等),是真正意义上的加密算法。摘要算法(如MD5等)是不可逆的,它的主要作用是对信息一致性和完整性的校验。而对称加密算法(AES等)是可逆的,它的主要作用是保证私密信息不被泄露。
2 AES的秘钥
密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和对密文的解密使用的是同一个密钥。
AES只支持三种长度(二进制位)的密钥:128位,192位和256位,分别对应16、24和32个字节。 而java的字符串一个字符恰好为1个字节。因此加解密秘钥字符串长度只能为16、24或32个字符。不是这3种长度就会抛异常!
平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。那么AES128,AES192,AES256在使用效果上有什么不同呢?
答:从安全性来看,AES256安全性最高。从性能来看,AES128性能最高。本质原因是它们的加密处理轮数不同。
3 AES加密的特点
AES加密有如下几个特点:
(1)可逆:AES加密算法是可逆的。用相同的秘钥就可以解密出原数据;
(2)简单、可靠和快速的加密方式;
(3)加密和解密的秘钥是相同的。
4 AES加解密流程
加解密流程如图所示:
5 AES加解密工具类
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import sun.misc.BASE64Decoder;
@Slf4j
public class AesUtil {
/**
* 加密解密密钥(必须为16、24或32位长度)
*/
private static final String KEY = "123456789012345612345678";
/**
* 加密算法
*/
private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
/**
* 加密
*
* @param content 待加密字符串
* @return 加密后的字符串
*/
public static String aesEncrypt(String content) {
try {
return aesEncrypt(content, KEY);
} catch (Exception e) {
log.error(e.getMessage(), e);
return "";
}
}
/**
* 解密
*
* @param encrypt 加密字符串
* @return 解密后的字符串
*/
public static String aesDecrypt(String encrypt) {
try {
return aesDecrypt(encrypt, KEY);
} catch (Exception e) {
log.error(e.getMessage(), e);
return "";
}
}
/**
* base64编码
*
* @param bytes 待编码的字节数组byte[]
* @return base64编码后的字符串
*/
private static String base64Encode(byte[] bytes) {
return Base64.encodeBase64String(bytes);
}
/**
* base64解码
*
* @param base64Code 待解码的base64编码字符串
* @return 解码后的字节数组byte[]
*/
private static byte[] base64Decode(String base64Code) throws Exception {
return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);
}
/**
* AES加密为base64编码字符串
*
* @param content 待加密的内容
* @param encryptKey 加密密钥
* @return base64编码字符串
*/
private static String aesEncrypt(String content, String encryptKey) throws Exception {
return base64Encode(aesEncryptToBytes(content, encryptKey));
}
/**
* AES加密为字节数组
*
* @param content 待加密的内容
* @param encryptKey 加密密钥
* @return 加密后的byte[]
*/
private static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
return cipher.doFinal(content.getBytes("utf-8"));
}
/**
* AES解密
*
* @param encryptStr 待解密的内容
* @param decryptKey 解密密钥
* @return 解密后的string
*/
private static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
}
/**
* AES解密为字符串
*
* @param encryptBytes 待解密的字节数组byte[]
* @param decryptKey 解密密钥
* @return 解密后的String
*/
private static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
byte[] decryptBytes = cipher.doFinal(encryptBytes);
return new String(decryptBytes);
}
/**
* AES加解密测试
*/
public static void main(String[] args) throws Exception {
String content = "关注微信公众号:IT特靠谱";
String encrypt = aesEncrypt(content, KEY);
String decrypt = aesDecrypt(encrypt, KEY);
log.info("AES加密前:{}", content);
log.info("AES加密后:{}", encrypt);
log.info("AES解密后:{}", decrypt);
}
}
6 AES加解密测试结果
如果你有疑问或需要技术支持,关注公众号联系我吧~
本文地址:https://blog.csdn.net/IT_Most/article/details/110087172