1. 程式人生 > >用Java進行AES256-ECB-PKCS7Padding加密

用Java進行AES256-ECB-PKCS7Padding加密

主要程式碼如下:

  1. import java.security.Security;  
  2. import javax.crypto.Cipher;  
  3. import javax.crypto.spec.SecretKeySpec;  
  4. import org.bouncycastle.jce.provider.BouncyCastleProvider;  
  5. publicclass Encrypt {  
  6.     publicstaticboolean initialized = false;  
  7.     publicstaticfinal String ALGORITHM = "AES/ECB/PKCS7Padding"
    ;  
  8.     /** 
  9.      * @param  String str  要被加密的字串 
  10.      * @param  byte[] key  加/解密要用的長度為32的位元組陣列(256位)金鑰 
  11.      * @return byte[]  加密後的位元組陣列 
  12.      */
  13.     publicstaticbyte[] Aes256Encode(String str, byte[] key){  
  14.         initialize();  
  15.         byte[] result = null;  
  16.         try{  
  17.             Cipher cipher = Cipher.getInstance(ALGORITHM, "BC"
    );  
  18.             SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key
  19.             cipher.init(Cipher.ENCRYPT_MODE, keySpec);  
  20.             result = cipher.doFinal(str.getBytes("UTF-8"));  
  21.         }catch(Exception e){  
  22.             e.printStackTrace();  
  23.         }  
  24.         return result;  
  25.     }  
  26.     /** 
  27.      * @param  byte[] bytes  要被解密的位元組陣列 
  28.      * @param  byte[] key    加/解密要用的長度為32的位元組陣列(256位)金鑰 
  29.      * @return String  解密後的字串 
  30.      */
  31.     publicstatic String Aes256Decode(byte[] bytes, byte[] key){  
  32.         initialize();  
  33.         String result = null;  
  34.         try{  
  35.             Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");  
  36.             SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key
  37.             cipher.init(Cipher.DECRYPT_MODE, keySpec);  
  38.             byte[] decoded = cipher.doFinal(bytes);  
  39.             result = new String(decoded, "UTF-8");  
  40.         }catch(Exception e){  
  41.             e.printStackTrace();  
  42.         }  
  43.         return result;  
  44.     }  
  45.     publicstaticvoid initialize(){  
  46.         if (initialized) return;  
  47.         Security.addProvider(new BouncyCastleProvider());  
  48.         initialized = true;  
  49.     }  
  50. }  

可以看到,程式碼開頭要先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就不再限制金鑰的長度了。