主要代码如下:
- import java.security.Security;
- import javax.crypto.Cipher;
- import javax.crypto.spec.SecretKeySpec;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
- public class Encrypt {
- public static boolean initialized = false;
- public static final String ALGORITHM = "AES/ECB/PKCS7Padding";
- /**
- * @param String str 要被加密的字符串
- * @param byte[] key 加/解密要用的长度为32的字节数组(256位)密钥
- * @return byte[] 加密后的字节数组
- */
- public static byte[] 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 解密后的字符串
- */
- public static 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;
- }
- public static void 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就不再限制密钥的长度了。