AES对称加密工具类,拿来即用!

Posted IT特靠谱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AES对称加密工具类,拿来即用!相关的知识,希望对你有一定的参考价值。

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
每一篇文章都是心得总结,跟我学习你就是大牛!


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;
@Slf4jpublic 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加解密测试结果

以上是关于AES对称加密工具类,拿来即用!的主要内容,如果未能解决你的问题,请参考以下文章

基于AES对称加密解密的代码块

Java 对称数据加密AES

AES加解密 对称加密

常用对称加密算法(DES/AES)类(PHP)

常用对称加密算法(DES/AES)类(PHP)

AES 对称加密中的 ECB 实现