1. 程式人生 > 實用技巧 >java AES加密

java AES加密

1、引入maven

<!-- Base64編碼需要  -->
        <dependency>
            <groupId>org.apache.directory.studio</groupId>
            <artifactId>org.apache.commons.codec</artifactId>
            <version>1.8</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.56</version>
        </dependency>

2、程式碼

  1 package com.hlt.ctms.org.utils;
  2 
  3 import org.apache.commons.codec.binary.Base64;
  4 import org.bouncycastle.jce.provider.BouncyCastleProvider;
  5 
  6 import javax.crypto.Cipher;
  7 import javax.crypto.spec.SecretKeySpec;
  8 import java.nio.charset.StandardCharsets;
  9 import
java.security.SecureRandom; 10 import java.util.Random; 11 12 /** 13 * AES加、解密演算法工具類 14 */ 15 public class AesUtil { 16 /** 17 * 加密演算法AES 18 */ 19 private static final String KEY_ALGORITHM = "AES"; 20 21 /** 22 * key的長度,Wrong key size: must be equal to 128, 192 or 256
23 * 傳入時需要16、24、36 24 */ 25 private static final Integer KEY_LENGTH = 16 * 8; 26 27 /** 28 * 演算法名稱/加密模式/資料填充方式 29 * 預設:AES/ECB/PKCS5Padding 30 */ 31 private static final String ALGORITHMS = "AES/ECB/PKCS5Padding"; 32 33 /** 34 * 後端AES的key,由靜態程式碼塊賦值 35 */ 36 public static String key; 37 38 static { 39 key = getKey(); 40 } 41 42 /** 43 * 獲取key 44 */ 45 public static String getKey() { 46 StringBuilder uid = new StringBuilder(); 47 //產生16位的強隨機數 48 Random rd = new SecureRandom(); 49 for (int i = 0; i < KEY_LENGTH / 8; i++) { 50 //產生0-2的3位隨機數 51 int type = rd.nextInt(3); 52 switch (type) { 53 case 0: 54 //0-9的隨機數 55 uid.append(rd.nextInt(10)); 56 break; 57 case 1: 58 //ASCII在65-90之間為大寫,獲取大寫隨機 59 uid.append((char) (rd.nextInt(25) + 65)); 60 break; 61 case 2: 62 //ASCII在97-122之間為小寫,獲取小寫隨機 63 uid.append((char) (rd.nextInt(25) + 97)); 64 break; 65 default: 66 break; 67 } 68 } 69 return uid.toString(); 70 } 71 72 /** 73 * 加密 74 * 75 * @param content 加密的字串 76 * @param encryptKey key值 77 */ 78 public static String encrypt(String content, String encryptKey) throws Exception { 79 //設定Cipher物件 80 Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider()); 81 cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM)); 82 83 //呼叫doFinal 84 byte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)); 85 86 // 轉base64 87 return Base64.encodeBase64String(b); 88 89 } 90 91 /** 92 * 解密 93 * 94 * @param encryptStr 解密的字串 95 * @param decryptKey 解密的key值 96 */ 97 public static String decrypt(String encryptStr, String decryptKey) throws Exception { 98 //base64格式的key字串轉byte 99 byte[] decodeBase64 = Base64.decodeBase64(encryptStr); 100 101 //設定Cipher物件 102 Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider()); 103 cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM)); 104 105 //呼叫doFinal解密 106 byte[] decryptBytes = cipher.doFinal(decodeBase64); 107 return new String(decryptBytes); 108 } 109 }

3、測試

 1 //16位
 2         String key = "MIGfMA0GCSqGSIb3";
 3 
 4         //字串
 5         String str = "測試下加密";
 6         try {
 7             //加密
 8             String encrypt = AesUtil.encrypt(str, key);
 9             //解密
10             String decrypt = AesUtil.decrypt(encrypt, key);
11 
12             System.out.println("加密前:" + str);
13             System.out.println("加密後:" + encrypt); //
14             System.out.println("解密後:" + decrypt);
15         } catch (Exception e) {
16             e.printStackTrace();
17         }

加密前:測試下加密
加密後:K50t0as9ReWNyzrH5MAiig==
解密後:測試下加密