JDK自帶方法實現AES對稱加密

請看代碼。html

複製代碼
  1 package jdbc.pro.lin;  2  3 import java.security.InvalidAlgorithmParameterException;  4 import java.security.InvalidKeyException;  5 import java.security.NoSuchAlgorithmException;  6  7 import javax.crypto.BadPaddingException;  8 import javax.crypto.Cipher;  9 import javax.crypto.IllegalBlockSizeException;  10 import javax.crypto.KeyGenerator;  11 import javax.crypto.NoSuchPaddingException;  12 import javax.crypto.SecretKey;  13 import javax.crypto.spec.IvParameterSpec;  14 import javax.crypto.spec.SecretKeySpec;  15  16 import org.apache.commons.codec.binary.Base64;  17  18 public class MyAES {  19 /**  20  * 注意key和加密用到的字符串是不同的 加密還要指定填充的加密模式和填充模式 AES密鑰能夠是128或者256,加密模式包括ECB, CBC等  21  * ECB模式是分組的模式,CBC是分塊加密後,每塊與前一塊的加密結果異或後再加密 第一塊加密的明文是與IV變量進行異或  22 */  23 public static final String KEY_ALGORITHM = "AES";  24 public static final String ECB_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";  25 public static final String CBC_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";  26 public static final String PLAIN_TEXT = "MANUTD is the greatest club in the world";  27  28 /**  29  * IV(Initialization Value)是一個初始值,對於CBC模式來講,它必須是隨機選取而且須要保密的  30  * 並且它的長度和密碼分組相同(好比:對於AES 128爲128位,即長度爲16的byte類型數組)  31  *  32 */  33 public static final byte[] IVPARAMETERS = new byte[] { 1, 2, 3, 4, 5, 6, 7,  34 8, 9, 10, 11, 12, 13, 14, 15, 16 };  35  36 public static void main(String[] arg) {  37 byte[] secretBytes = generateAESSecretKey();  38 SecretKey key = restoreSecretKey(secretBytes);  39 byte[] encodedText = AesEcbEncode(PLAIN_TEXT.getBytes(), key);  40  41 System.out.println("AES ECB encoded with Base64: " + Base64.encodeBase64String(encodedText));  42 System.out.println("AES ECB decoded: "  43 + AesEcbDecode(encodedText, key));  44  45  46  47 encodedText = AesCbcEncode(PLAIN_TEXT.getBytes(), key, IVPARAMETERS);  48  49  50 System.out.println("AES CBC encoded with Base64: " + Base64.encodeBase64String(encodedText));  51 System.out.println("AES CBC decoded: "  52 + AesCbcDecode(encodedText, key,  53  IVPARAMETERS));  54  }  55  56 /**  57  * 使用ECB模式進行加密。 加密過程三步走: 1. 傳入算法,實例化一個加解密器 2. 傳入加密模式和密鑰,初始化一個加密器 3.  58  * 調用doFinal方法加密  59  *  60  * @param plainText  61  * @return  62 */  63 public static byte[] AesEcbEncode(byte[] plainText, SecretKey key) {  64  65 try {  66  67 Cipher cipher = Cipher.getInstance(ECB_CIPHER_ALGORITHM);  68  cipher.init(Cipher.ENCRYPT_MODE, key);  69 return cipher.doFinal(plainText);  70 } catch (NoSuchAlgorithmException | NoSuchPaddingException  71 | InvalidKeyException | IllegalBlockSizeException  72 | BadPaddingException e) {  73 // TODO Auto-generated catch block  74  e.printStackTrace();  75  }  76 return null;  77  }  78  79 /**  80  * 使用ECB解密,三步走,不說了  81  *  82  * @param decodedText 83 * @param key 84 * @return 85 */ 86 public static String AesEcbDecode(byte[] decodedText, SecretKey key) { 87 try { 88 Cipher cipher = Cipher.getInstance(ECB_CIPHER_ALGORITHM); 89 cipher.init(Cipher.DECRYPT_MODE, key); 90 return new String(cipher.doFinal(decodedText)); 91 } catch (NoSuchAlgorithmException | NoSuchPaddingException 92 | InvalidKeyException | IllegalBlockSizeException 93 | BadPaddingException e) { 94 // TODO Auto-generated catch block 95 e.printStackTrace(); 96 } 97 return null; 98 99 } 100 101 /** 102 * CBC加密,三步走,只是在初始化時加了一個初始變量 103 * 104 * @param plainText 105 * @param key 106 * @param IVParameter 107 * @return 108 */ 109 public static byte[] AesCbcEncode(byte[] plainText, SecretKey key, 110 byte[] IVParameter) { 111 try { 112 IvParameterSpec ivParameterSpec = new IvParameterSpec(IVParameter); 113 114 Cipher cipher = Cipher.getInstance(CBC_CIPHER_ALGORITHM); 115 cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); 116 return cipher.doFinal(plainText); 117 118 } catch (NoSuchAlgorithmException | NoSuchPaddingException 119 | InvalidKeyException | InvalidAlgorithmParameterException 120 | IllegalBlockSizeException | BadPaddingException e) { 121 // TODO Auto-generated catch block 122 e.printStackTrace(); 123 } 124 return null; 125 } 126 127 /** 128 * CBC 解密 129 * 130 * @param decodedText 131 * @param key 132 * @param IVParameter 133 * @return 134 */ 135 public static String AesCbcDecode(byte[] decodedText, SecretKey key, 136 byte[] IVParameter) { 137 IvParameterSpec ivParameterSpec = new IvParameterSpec(IVParameter); 138 139 try { 140 Cipher cipher = Cipher.getInstance(CBC_CIPHER_ALGORITHM); 141 cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec); 142 return new String(cipher.doFinal(decodedText)); 143 } catch (NoSuchAlgorithmException | NoSuchPaddingException 144 | InvalidKeyException | InvalidAlgorithmParameterException 145 | IllegalBlockSizeException | BadPaddingException e) { 146 // TODO Auto-generated catch block 147 e.printStackTrace(); 148 } 149 150 return null; 151 152 } 153 154 /** 155 * 1.建立一個KeyGenerator 2.調用KeyGenerator.generateKey方法 156 * 因爲某些緣由,這裏只能是128,若是設置爲256會報異常,緣由在下面文字說明 157 * 158 * @return 159 */ 160 public static byte[] generateAESSecretKey() { 161 KeyGenerator keyGenerator; 162 try { 163 keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM); 164 // keyGenerator.init(256); 165 return keyGenerator.generateKey().getEncoded(); 166 } catch (NoSuchAlgorithmException e) { 167 // TODO Auto-generated catch block 168 e.printStackTrace(); 169 } 170 return null; 171 } 172 173 /** 174 * 還原密鑰 175 * 176 * @param secretBytes 177 * @return 178 */ 179 public static SecretKey restoreSecretKey(byte[] secretBytes) { 180 SecretKey secretKey = new SecretKeySpec(secretBytes, KEY_ALGORITHM); 181 return secretKey; 182 } 183 }
複製代碼

 

由於某些國家的進口管制限制,Java發佈的運行環境包中的加解密有必定的限制。好比默認不容許256位密鑰的AES加解密,解決方法就是修改策略文件。java

 
 官方網站提供了JCE無限制權限策略文件的下載:

  JDK6的下載地址:
   http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

  JDK7的下載地址:
   http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

下載後解壓,能夠看到local_policy.jar和US_export_policy.jar以及readme.txt。

若是安裝了JRE,將兩個jar文件放到%JRE_HOME%\lib\security下覆蓋原來文件,記得先備份。

若是安裝了JDK,將兩個jar文件也放到%JDK_HOME%\jre\lib\security下。
 
PS:我也沒試過,不行別找我。
 
KeyFactory最經常使用的操做就是經過密鑰規範得到對應的密鑰。像DES 3DES都是經過這樣得到的,而AES只要通常的密鑰規範就能夠了,所以不須要KeyFactory.
原:http://www.cnblogs.com/SirSmith/p/4987064.html
相關文章
相關標籤/搜索