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

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

程序员文章站 2022-04-29 17:22:02
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加解密流程

      加解密流程如图所示:

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

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

      如果你有疑问或需要技术支持,关注公众号联系我吧~

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

 

本文地址:https://blog.csdn.net/IT_Most/article/details/110087172

相关标签: 加密解密 java