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 = "********";

    /**

    • 默認(rèn)的密鑰
      */
      public static final String DEFAULT_KEY = "1bd83b249a414036";

    /**

    • 產(chǎn)生隨機密鑰(這里產(chǎn)生密鑰必須是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 統(tǒng)一
      // 這里的 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);
      // 同樣對加密后數(shù)據(jù)進行 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);
    }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 之前一直對加密相關(guān)的算法知之甚少,只知道類似DES、RSA等加密算法能對數(shù)據(jù)傳輸進行加密,且各種加密算法各有...
    Henryzhu閱讀 3,232評論 0 14
  • 1、不安全的隨機數(shù)生成,在CSRF TOKEN生成、password reset token生成等,會造成toke...
    nightmare丿閱讀 4,002評論 0 1
  • 1. ASCII 編碼 ASCII(American Standard Code for Information ...
    s酸菜閱讀 8,884評論 0 8
  • 密碼學(xué)中的高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),又稱Rijndael加...
    testfk6688閱讀 2,999評論 0 0
  • 1. 村里80歲的孫婆婆走了,在這個寒冷的雨夜。 聞訊趕回來的兒子、媳婦兒們開著車剛一進村,便從敞開著的車窗里傳出...
    纖子墨閱讀 663評論 2 21

友情鏈接更多精彩內(nèi)容