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)生隨機(jī)密鑰(這里產(chǎn)生密鑰必須是16位)
      */
      public static String generateKey() {
      String key = UUID.randomUUID().toString();
      key = key.replace("-", "").substring(0, 16);// 替換掉-號(hào)
      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);
      // 同樣對(duì)加密后數(shù)據(jù)進(jìn)行 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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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

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