2019-08-21

AES工具类

import java.util.UUID;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**

  • AES工具类,密钥必须是16位字符串
    /
    public class AESUtils {
    public static final String SECREKEY = "*********!";//加密的key;
    /
    偏移量,必须是16位字符串/
    private static final String IV_STRING = "********";

    /**

    • 默认的密钥
      */
      public static final String DEFAULT_KEY = "1bd83b249a414036";

    /**

    • 产生随机密钥(这里产生密钥必须是16位)
      */
      public static String generateKey() {
      String key = UUID.randomUUID().toString();
      key = key.replace("-", "").substring(0, 16);// 替换掉-号
      return key;
      }

    /**

    • 加密
    • @param key
    • @param content
    • @return
      */
      public static String encryptData(String key, String content) {
      byte[] encryptedBytes = new byte[0];
      try {
      byte[] byteContent = content.getBytes("UTF-8");
      // 注意,为了能与 iOS 统一
      // 这里的 key 不可以使用 KeyGenerator、SecureRandom、SecretKey 生成
      byte[] enCodeFormat = key.getBytes();
      SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
      byte[] initParam = IV_STRING.getBytes();
      IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
      // 指定加密的算法、工作模式和填充方式
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
      encryptedBytes = cipher.doFinal(byteContent);
      // 同样对加密后数据进行 base64 编码
      return Base64Utils.encode(encryptedBytes);
      } catch (Exception e) {
      e.printStackTrace();
      }
      return null;
      }

    /**

    • 解密
    • @param key
    • @param content
    • @return
      */
      public static String decryptData(String key, String content) {
      try {
      // base64 解码
      byte[] encryptedBytes = Base64Utils.decode(content);
      byte[] enCodeFormat = key.getBytes();
      SecretKeySpec secretKey = new SecretKeySpec(enCodeFormat, "AES");
      byte[] initParam = IV_STRING.getBytes();
      IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
      cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
      byte[] result = cipher.doFinal(encryptedBytes);
      return new String(result, "UTF-8");
      } catch (Exception e) {
      e.printStackTrace();
      }
      return null;
      }

    public static void main(String[] args) {
    String plainText = AESUtils.decryptData("F431E6FF9051DA07", "q8jHYk6LSbwC2K4zmr/wRZo8mlH0VdMzPEcAzQadTCpSrPQ/ZnTmuIvQxiLOnUXu");
    System.out.println("aes加密后: " + plainText);
    }

}

推荐阅读更多精彩内容

  • 1、不安全的随机数生成,在CSRF TOKEN生成、password reset token生成等,会造成toke...
    nightmare丿阅读 2,166评论 0 1
  • 1. ASCII 编码 ASCII(American Standard Code for Information ...
    s酸菜阅读 5,864评论 0 7
  • 直接上代码:package com.macroflag.common.util; import org.apach...
    我的天空_0b94阅读 160评论 0 0
  • 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加...
    testfk6688阅读 1,413评论 0 0
  • 1. 村里80岁的孙婆婆走了,在这个寒冷的雨夜。 闻讯赶回来的儿子、媳妇儿们开着车刚一进村,便从敞开着的车窗里传出...
    纤子墨阅读 299评论 2 21