1、引言
DES演算法被攻破後,美國政府公開徵集下一代資料加密演算法來取代DES,經過層層篩選,最終選定了比利時密碼學家Joan Daemen和Vincent Rijmen所設計的演算法,被命名為AES演算法。
2001年,AES作為FIPS PUB 197標準,被美國國家標準院釋出。隨後,IETF組織釋出了多個使用AES的標準,例如RFC3394、RFC3537、RFC3565、RFC3566、RFC3862,使用AES的RFC標準總數多達15個,足以見得AES的重要性。
這些標準大家可以透過百度輕鬆查詢獲得,感興趣的朋友可以自己查詢後仔細學習。
2、AES演算法介紹AES是英語Advanced Encryption Standard的縮寫,即“高階加密標準”。
和DES一樣,AES也是一種對稱加密演算法。
AES演算法公佈後,雖然有人透過旁路攻擊的方式攻破了使用AES的軟體系統,但是這種方式是利用了不安全系統洩漏的資訊進行的,因此從本質上來說,AES演算法還從未有被攻破的記錄。
二十多年來,計算機執行速度突飛猛進,AES系統依然安全如故,足以見得AES演算法的安全性和可靠性。
3、使用JDK提供的AES功能AES的金鑰長度有128位、192位、256位三種,但是JDK只支援128位的,下面的例子使用了128位的AES演算法。原始碼如下:
package com.flying.aes;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.SecretKeySpec;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;@SpringBootApplicationpublic class AesApplication { public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { SpringApplication.run(AesApplication.class, args); byte[] keyBytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; printBytes("Key of AES is ", keyBytes); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES"); byte[] plainBytes = {1, 2, 3, 4, 5, 6, 7, 8}; printBytes("Plain text of AES is", plainBytes); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); byte[] encrytedBytes = cipher.doFinal(plainBytes); printBytes("Encryped text of AES is", encrytedBytes); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); byte[] decryptedBytes = cipher.doFinal(encrytedBytes); printBytes("Decrypted text of AES is", decryptedBytes); } /** * 以十六進位制列印位元組陣列 * @param prompt * @param bytes */ private static void printBytes(String prompt, byte[] bytes){ if (prompt == null || bytes == null){ return; } System.out.print(prompt + ":"); for (int i=0; i<bytes.length; i++){ System.out.printf(" %02X", bytes[i]); } System.out.println(); }}
執行該程式,結果如下:
從程式執行的輸出可以看到程式的邏輯:
(1)AES演算法使用的金鑰是01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10;
(2)AES對01 02 03 04 05 06 07 08進行加密,得到66 D8 13 23 12 0A 92 27 70 3A BC F1 14 30 2D 2A;
(3)AES對66 D8 13 23 12 0A 92 27 70 3A BC F1 14 30 2D 2A進行解密,得到01 02 03 04 05 06 07 08。
因此,使用AES演算法的該程式正常執行。
4、後記上面的例子,使用了JDK提供的128位AES演算法,如果需要使用256位的AES演算法,可以使用bouncy castle提供的Java包bcprov-jdk15on,使用該包後,原始碼和上面基本上相同,需要使用AES256的朋友可以百度一下相關資料,很簡單的,這裡就不再提供原始碼了。