天天看點

Java使用AES加解密

Java使用AES加解密

目錄

1.1生成密鑰

1.2密鑰的存儲

1.3擷取存儲的密鑰

1.4加解密

1.5使用存儲的密鑰進行加解密示例

AES是一種對稱的加密算法,可基于相同的密鑰進行加密和解密。Java采用AES算法進行加解密的邏輯大緻如下:

1、生成/擷取密鑰

2、加/解密

密鑰的生成是通過KeyGenerator來生成的。通過擷取一個KeyGenerator執行個體,然後調用其generateKey()方法即可生成一個SecretKey對象。大緻邏輯一般如下:

上述生成密鑰的過程中指定了固定的種子,每次生成出來的密鑰都是一樣的。還有一種形式,我們可以通過不指定SecureRandom對象的種子,即不調用其setSeed方法,這樣每次生成出來的密鑰都可能是不一樣的。

通過KeyGenerator的init(keySize)方法進行初始化,而不是通過傳遞SecureRandom對象進行初始化也可以達到上面的效果,每次生成的密鑰都可能是不一樣的。但是對應的keySize的指定一定要正确,AES算法的keySize是128。

但是這種每次生成出來的密鑰都是不同的情況下,我們需要把加密用的密鑰存儲起來,以供解密的時候使用,不然就沒法進行解密了。

密鑰SecretKey裡面最核心的内容就是其中的密鑰對應的位元組數組,可以通過SecretKey的getEncoded()方法擷取。然後把它存儲起來即可。最簡單的方式就是直接寫入一個檔案中。

擷取存儲的密鑰的核心是把密鑰的位元組數組轉換為對應的SecretKey。這可以通過SecretKeySpec來擷取,其實作了SecretKey接口,然後構造參數裡面将接收密鑰的位元組數組。

Java采用AES算法進行加解密的過程是類似的,具體如下:

1、指定算法,擷取一個Cipher執行個體對象

2、生成/讀取用于加解密的密鑰

3、用指定的密鑰初始化Cipher對象,同時指定加解密模式,是加密模式還是解密模式。

4、通過update指定需要加密的内容,不可多次調用。

5、通過Cipher的dofinal()進行最終的加解密操作。

通過以上幾步就完成了使用AES算法進行加解密的操作了。其實第4、5步是可以合在一起的,即在進行doFinal的時候傳遞需要進行加解密的内容。但是如果update指定了加密的内容,而doFinal的時候也指定了加密的内容,那最終加密出來的結果将是兩次指定的加密内容的和對應的加密結果。

以下是一次加解密操作的完整示例。

在上面的示例中,我們先生成了一個密鑰,然後把它儲存到本地檔案中,然後再把它讀出來,分别用以加密和解密。而且我們加密和解密都是用的同一個Cipher對象,但是在使用前需要重新通過init方法初始化加解密模式。

(Elim寫于2017年4月20日星期四)