java AES加密
阿新 • • 發佈:2020-12-11
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 importjava.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 25623 * 傳入時需要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==
解密後:測試下加密