AES加密演算法的JAVA實現
最近公司需要,看了看AES對稱加密演算法,具體原理沒有仔細研究還,先說說用法吧,由於能力有限,不足之處請大家多多指教,好了,不說廢話了,直接上程式碼
/** * 加密 * * @param content 需要加密的內容 * @param password 加密密碼 * @return */ public static byte[] encrypt(String content, String password) { KeyGenerator kgen = null; try { kgen = KeyGenerator.getInstance("AES"); kgen.init(128, new SecureRandom(password.getBytes())); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 建立密碼器 cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 byte[] byteContent = content.getBytes("utf-8"); byte[] result = cipher.doFinal(byteContent); return result;//加密 } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | BadPaddingException | UnsupportedEncodingException | IllegalBlockSizeException e) { e.printStackTrace(); } return null; } /** * 解密 * * @param content 待解密內容 * @param password 解密金鑰 * @return */ public static byte[] decrypt(byte[] content, String password) { KeyGenerator kgen = null; try { kgen = KeyGenerator.getInstance("AES"); kgen.init(128, new SecureRandom(password.getBytes())); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 建立密碼器 cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 byte[] result = cipher.doFinal(content); return result; // 解密 } catch (NoSuchAlgorithmException | BadPaddingException | IllegalBlockSizeException | NoSuchPaddingException | InvalidKeyException e) { e.printStackTrace(); } return null; }
我們測試一下效果:
String content = "test"; String password = "123456"; //加密 System.out.println("加密前:" + content); byte[] encryptResult = encrypt(content, password); System.out.println("加密後:" + encryptResult.toString()); //解密 byte[] decryptResult = decrypt(encryptResult, password); System.out.println("解密後:" + new String(decryptResult));
但有一點一定要注意——加密後的byte陣列是不能強制轉換成字串的,我們可以實驗下:
//解密 try { String encryptResultStr = new String(encryptResult, "utf-8"); byte[] decryptResult = decrypt(encryptResultStr.getBytes("utf-8"), password); System.out.println("解密後:" + new String(decryptResult)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }執行後,會報如下錯誤:
具體原因我們就不再詳細解釋了,事實上這種方法也是沒有實際意義的,因為我們要考慮java的跨平臺特性,因此我們使用這句:
kgen.init(128, new SecureRandom(password.getBytes()));
生成隨機金鑰,在別的平臺很可能獲得的金鑰是不相同的,所以這隻裡能當做展示罷了。
網上看了很多文章,發現還是這樣寫合適:
/** * 加密 * @param content * @param strKey * @return * @throws Exception */ public static byte[] encrypt(String content,String strKey ) throws Exception { SecretKeySpec skeySpec = getKey(strKey); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes()); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(content.getBytes()); return encrypted; } /** * 解密 * @param strKey * @param content * @return * @throws Exception */ public static String decrypt(byte[] content,String strKey ) throws Exception { SecretKeySpec skeySpec = getKey(strKey); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte[] original = cipher.doFinal(content); String originalString = new String(original); return originalString; } private static SecretKeySpec getKey(String strKey) throws Exception { byte[] arrBTmp = strKey.getBytes(); byte[] arrB = new byte[16]; // 建立一個空的16位位元組陣列(預設值為0) for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { arrB[i] = arrBTmp[i]; } SecretKeySpec skeySpec = new SecretKeySpec(arrB, "AES"); return skeySpec; }
測試就不寫了,我們再對版本功能進行一下加強,對傳輸的資料使用base64進行編碼,先寫base64的編碼和解碼:
參考:/** * base 64 encode * @param bytes 待編碼的byte[] * @return 編碼後的base 64 code */ public static String base64Encode(byte[] bytes){ return new BASE64Encoder().encode(bytes); } /** * base 64 decode * @param base64Code 待解碼的base 64 code * @return 解碼後的byte[] * @throws Exception */ public static byte[] base64Decode(String base64Code) throws Exception{ return base64Code.isEmpty() ? null : new BASE64Decoder().decodeBuffer(base64Code); }
接著對AES加密的資料進行base64編碼,對AES解密的資料進行解碼:
好了,受個人水平所限,就先寫這麼多吧,以後有更多內容再往上補充
/** * AES加密為base 64 code * @param content 待加密的內容 * @param encryptKey 加密金鑰 * @return 加密後的base 64 code * @throws Exception */ public static String aesEncrypt(String content, String encryptKey) throws Exception { return base64Encode(encrypt(content, encryptKey)); } /** * 將base 64 code AES解密 * @param encryptStr 待解密的base 64 code * @param decryptKey 解密金鑰 * @return 解密後的string * @throws Exception */ public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception { return encryptStr.isEmpty() ? null : decrypt(base64Decode(encryptStr), decryptKey); }
寫一個測試,看下效果:
public static void main(String[] args) throws Exception { String test = "我愛你"; System.out.println("加密前:" + test); String key = "123456"; System.out.println("金鑰:" + key); String encrypt = aesEncrypt(test, key); System.out.println("加密後:" + encrypt); String decrypt = aesDecrypt(encrypt, key); System.out.println("解密後:" + decrypt); }
好了,受個人水平所限,就先寫這麼多吧,以後有更多內容再往上補充
相關文章
- Java實現AES和RSA演算法Java演算法
- STM32: 實現ADVANCED ENCRYPTION STANDARD(AES) – 128-BIT加密演算法加密演算法
- AES 加密演算法的詳細介紹加密演算法
- app直播原始碼,android AES加密解密實現APP原始碼Android加密解密
- 通過Go實現AES加密和解密工具Go加密解密
- AES實現財務資料的加密解密儲存加密解密
- JavaScript實現的base64加密、md5加密、sha1加密及AES加密JavaScript加密
- Java中Blowfish加密演算法實現Java加密演算法
- QQ TEA加密演算法 JAVA實現加密演算法Java
- Java AES加密和解密教程 - BaeldungJava加密解密
- AES加密加密
- AES演算法:加密通訊的新選擇演算法加密
- PHP 實現 AES-128-CBC-PKCS5Padding 加密PHPpadding加密
- Golang AES加密Golang加密
- AES加密解密加密解密
- AES 加密&解密加密解密
- Java實現常用加密演算法-SM4Java加密演算法
- JavaScript前端和Java後端的AES加密和解密JavaScript前端後端加密解密
- 區塊鏈背後的資訊保安(1)AES加密演算法原理及其GO語言實現區塊鏈加密演算法Go
- Vue使用AES加密Vue加密
- AES CBC 加密解密加密解密
- netcore AES同等效轉java語言 加密方法NetCoreJava加密
- 【5】JMicro其於RSA及AES加密實現安全服務呼叫加密
- php中aes加密和rsa加密的區別PHP加密
- AES-CBC 模式加密模式加密
- AES演算法測試用例程式Java實現(金鑰長度128位元)演算法Java
- [譯] 最佳安全實踐:在 Java 和 Android 中使用 AES 進行對稱加密JavaAndroid加密
- nodejs常用加密方式 RSA & AESNodeJS加密
- Python AES 加密和解密(qbit)Python加密解密
- golang AES-CBC 加密解密Golang加密解密
- python AES-CBC 加密解密Python加密解密
- 逆向工程加密函式:AES加密函式
- AES 演算法演算法
- [譯]最佳安全實踐:在 Java 和 Android 中使用 AES 進行對稱加密:第2部分:AES-CBC + HMACJavaAndroid加密Mac
- AES和DES程式碼實現
- 安全篇-AES/RSA加密機制加密
- 十分鐘看懂AES加密加密
- PHP 實現 Base64 加密演算法PHP加密演算法
- 量子圖形加密演算法的MATLAB程式碼實現加密演算法Matlab