主要代码如下:
importjava.security.Security;
importjavax.crypto.Cipher;
importjavax.crypto.spec.SecretKeySpec;
importorg.bouncycastle.jce.provider.BouncyCastleProvider;
publicclassEncrypt {
publicstaticbooleaninitialized =false;
publicstaticfinalString 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 = newSecretKeySpec(key,"AES");//生成加密解密需要的Key
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
result = cipher.doFinal(str.getBytes("UTF-8"));
}catch(Exception e){
e.printStackTrace();
}
returnresult;
}
/**
* @param byte[] bytes 要被解密的字节数组
* @param byte[] key 加/解密要用的长度为32的字节数组(256位)密钥
* @return String 解密后的字符串
*/
publicstaticString Aes256Decode(byte[] bytes,byte[] key){
initialize();
String result = null;
try{
Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
SecretKeySpec keySpec = newSecretKeySpec(key,"AES");//生成加密解密需要的Key
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decoded = cipher.doFinal(bytes);
result = newString(decoded,"UTF-8");
}catch(Exception e){
e.printStackTrace();
}
returnresult;
}
publicstaticvoidinitialize(){
if(initialized)return;
Security.addProvider(newBouncyCastleProvider());
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就不再限制密钥的长度了。