AES/CBC/PKCS5Padding
1、导入相关jar包
jdk7 需要去网上下载local_policy.jar和US_export_policy.jar这两个jar包放到你的jdk安装路径下的security 目录下,替换原来的2个jar包。
jdk8就不需要这么复杂了,只修改一个配置就可以了。在你的jdk安装路径下 ${JAVA_HOME}\jre\lib\security
比如我的是:
D:\java\jdk1.8\jre\lib\security
编辑 java.security 文件找到下边这一行代码,把 # 号删除掉就可以了。
#crypto.policy=unlimited
注:jdk8不需要现在新的jar包替换的原因是,它已经帮你下载好了,只要修改配置就能生效,jar包在如下路径下。
D:\java\jdk1.8\jre\lib\security\policy\unlimited
2、代码
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
public class AseUtil {
private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
/**
* 加密
* @param srcData 需要加密的数据
* @param key 密钥
* @param iv 向量
* @return
* @throws Exception
*/
public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key,byte[] iv) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
byte[] encData = cipher.doFinal(srcData);
return encData;
}
/**
* //解密
* @param encData 需要解密的数据
* @param key 密钥
* @param iv 向量
* @return
* @throws Exception
*/
public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key,byte[] iv) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));
byte[] decbbdt = cipher.doFinal(encData);
return decbbdt;
}
public static void main(String[] args) throws Exception {
String test = "test"; //测试代码
String key = "ABCDABCDABCDABCD"; // 密钥
byte[] keyb = key.getBytes("UTF-8");
System.out.println("key:" + Arrays.toString(keyb));
//设置向量(只能是16位)
byte[] iv = new byte[16];
for (int i = 0; i <16; i++) {
iv[i] = 1;
}
byte[] bytes = AES_cbc_encrypt(test.getBytes("UTF-8"), keyb, iv);
System.out.println("加密後的數組:" + Arrays.toString(bytes));
byte[] bytes1 = AES_cbc_decrypt(bytes, keyb, iv);
System.out.println("解密后的字符串:" + new String(bytes1));
}
}
3、输出结果
key:[65, 66, 67, 68, 65, 66, 67, 68, 65, 66, 67, 68, 65, 66, 67, 68]
加密後的數組:[-39, 76, 40, -33, 70, -35, 77, -124, -69, 121, 96, 49, -60, 82, -109, -64]
解密后的字符串:test
4、记录可能遇到的bug
- 向量必须是16byte,不然会报此错误
//代码
//设置向量(只能是16位)
byte[] iv = new byte[16];
for (int i = 0; i <16; i++) {
iv[i] = 1;
}
//错误
Exception in thread "main" java.security.InvalidAlgorithmParameterException:
Wrong IV length: must be 16 bytes long
- 如果不设置向量,此时代码不会报错,运行时会报此错误
1、cipher.init(Cipher.DECRYPT_MODE, keySpec); //未设置向量
2、cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv)); //设置向量
//报错
Exception in thread "main" java.security.InvalidKeyException: Parameters missing
- 密钥必须是16位,否则会报此错误
//报错
Exception in thread "main" java.security.InvalidKeyException:
Invalid AES key length: 15 bytes