首頁>技術>

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的朋友可以百度一下相關資料,很簡單的,這裡就不再提供原始碼了。

15
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 超優 Vue+Element+Spring 中後端解決方案