在系統開發的或城中,爲了安全性的考慮,我會們對一些數據進行加密的處理,這邊提供了AES加密算法的java實現,有本身的一些理解,也有網上的一些代碼,算是一個綜合吧,有不足之處,望你們指教,話很少少,直接上代碼:java
package ice.snow.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; /** * AES加密解密 * @author Binbin.Yang * @date 2018-06-06 */ public class AESUtil { private final static Logger logger = LoggerFactory.getLogger(AESUtil.class); private static final String DEFAULT_ENCRYPT_TYPE = "AES"; // 默認加密方式 private static final String DEFAULT_ENCRYPT_METHOD = "AES/ECB/PKCS5Padding"; // 默認加密算法 private static final String ENCODING_TYPE = "UTF-8";// 編碼類型 private static final String DEFAULT_METHOD = "SHA1PRNG";//默認算法實現 private AESUtil(){ } /** * 加密算法 * @param content 須要被加密的對象 * @param key 加密祕鑰 * @return */ public static String encrypt(String content,String key){ try{ // 建立密碼器 Cipher cipher = Cipher.getInstance(DEFAULT_ENCRYPT_METHOD); // 密碼器初始化爲加密模式 cipher.init(Cipher.ENCRYPT_MODE,createSecretKey(key)); // 進行數據加密,得到相應的字節數組 byte[] result = cipher.doFinal(content.getBytes(ENCODING_TYPE)); // 使用base64加密返回字符串 return paresByte2HexString(result); }catch (Exception e){ logger.error("對 " +content+ " 加密出現異常",e); } return null; } /** * 解密算法 * @param content 須要被解密的對象 * @param key 解密祕鑰,需和加密祕鑰相同 * @return */ public static String decrypt(String content,String key){ try{ // 建立密碼器 Cipher cipher = Cipher.getInstance(DEFAULT_ENCRYPT_METHOD); // 密碼器初始化爲解密模式 cipher.init(Cipher.DECRYPT_MODE,createSecretKey(key)); // 先使用base64對內容進行解密得到字節數組,而後在進行aes解密 byte[] result = cipher.doFinal(paresHexString2Byte(content)); return new String(result,ENCODING_TYPE); }catch (Exception e){ logger.error("對 "+content+ " 解密出現異常",e); } return null; } /** * 生成對應的祕鑰 * @param key * @return */ private static SecretKeySpec createSecretKey(String key){ try{ // 得到指定算法加密生成器 KeyGenerator generator = KeyGenerator.getInstance(DEFAULT_ENCRYPT_TYPE); // 得到隨機祕鑰信息,經過Instancef方法和setSeed方法進行處理,保證在不一樣的操做系統下生成的結果一致 // 若是直接使用 generator.init(128,new SecureRandom(key.getBytes(ENCODING_TYPE))),會出如今linux系統下每次加密的結果不一致, // 這是由於SecureRandom 實現徹底隨操做系統自己的內部狀態 SecureRandom random = SecureRandom.getInstance(DEFAULT_METHOD); random.setSeed(key.getBytes(ENCODING_TYPE)); // 指定祕鑰長度,以及祕鑰信息 generator.init(128,random); // 生成祕鑰 SecretKey secretKey = generator.generateKey(); // 返回AES專用祕鑰 return new SecretKeySpec(secretKey.getEncoded(),DEFAULT_ENCRYPT_TYPE); } catch (Exception e){ logger.error("經過 "+key+" 獲取祕鑰出現異常",e); } return null; } /** * 二進進制轉爲十六進制 * @param buf * @return */ private static String paresByte2HexString(byte[] buf){ StringBuffer sb = new StringBuffer(); for (int i = 0; i < buf.length; i++) { String hex = Integer.toHexString(buf[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); } /** * 十六進制轉爲二進制 * @param hexStr 必須爲十六進制字符串 * @return */ private static byte[] paresHexString2Byte(String hexStr){ if (hexStr.length() < 1) return null; byte[] result = new byte[hexStr.length()/2]; for (int i = 0;i< hexStr.length()/2; i++) { int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); result[i] = (byte) (high * 16 + low); } return result; } }