用Java進行AES256-ECB-PKCS7Padding加密
阿新 • • 發佈:2019-02-16
主要程式碼如下:
- import java.security.Security;
- import javax.crypto.Cipher;
- import javax.crypto.spec.SecretKeySpec;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
- publicclass Encrypt {
- publicstaticboolean initialized = false;
-
publicstaticfinal String ALGORITHM = "AES/ECB/PKCS7Padding"
- /**
- * @param String str 要被加密的字串
- * @param byte[] key 加/解密要用的長度為32的位元組陣列(256位)金鑰
- * @return byte[] 加密後的位元組陣列
- */
- publicstaticbyte[] Aes256Encode(String str, byte[] key){
- initialize();
- byte[] result = null;
- try{
-
Cipher cipher = Cipher.getInstance(ALGORITHM, "BC"
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key
- cipher.init(Cipher.ENCRYPT_MODE, keySpec);
- result = cipher.doFinal(str.getBytes("UTF-8"));
- }catch(Exception e){
- e.printStackTrace();
- }
-
return result;
- }
- /**
- * @param byte[] bytes 要被解密的位元組陣列
- * @param byte[] key 加/解密要用的長度為32的位元組陣列(256位)金鑰
- * @return String 解密後的字串
- */
- publicstatic String Aes256Decode(byte[] bytes, byte[] key){
- initialize();
- String result = null;
- try{
- Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
- SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key
- cipher.init(Cipher.DECRYPT_MODE, keySpec);
- byte[] decoded = cipher.doFinal(bytes);
- result = new String(decoded, "UTF-8");
- }catch(Exception e){
- e.printStackTrace();
- }
- return result;
- }
- publicstaticvoid initialize(){
- if (initialized) return;
- Security.addProvider(new BouncyCastleProvider());
- initialized = true;
- }
- }
可以看到,程式碼開頭要先import Java Cryptography Extension (JCE)中的兩個類——加/解密類Cipher和金鑰類SecretKeySpec,以及BouncyCastle的一個開源加/解密類庫中的加/解密演算法提供者類BouncyCastleProvider。
PC上的Java裡面只有"AES/ECB/PKCS5Padding"演算法,沒有"AES/ECB/PKCS7Padding"演算法。故需要引入BouncyCastle的庫,並給Cipher.getInstance方法傳入引數"BC"來指定Java使用這個庫裡的加/解密演算法。BouncyCastle的加/解密類庫的下載地址:http://www.bouncycastle.org/latest_releases.html
在這段程式碼可以執行之前,還有一個問題需要解決。Java本身限制金鑰的長度最多128位,而AES256需要的金鑰長度是256位,因此需要到Java官網上下載一個Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files。在Java SE的下載頁面下面的Additional Resources那裡會有下載連結。下載後開啟壓縮包,裡面有兩個jar檔案。把這兩個jar檔案解壓到JRE目錄下的lib/security資料夾,覆蓋原來的檔案。這樣Java就不再限制金鑰的長度了。