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

2022-07-27,,,,

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从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

《AES对称加密工具类,拿来即用!.doc》

下载本文的Word格式文档,以方便收藏与打印。