需要第三方jar包:bcprov.jar:百度云下载地址
1.方法介绍
分别是加解密的方法。主要参数是三个:
1.需要加密的字符串
2.加密钥匙。经测试,只能16位或者32位。
3.IV。即偏移量。只能16位。
2.工具类缺陷
1.没有做容错处理,对加密钥匙,不是16位或者32位,应该以“0” 填充或删除。
3.修改如下
1.编码形式使用:BASE64。 也可自己替换成HEX编码,该类含有HEX的工具类。
4.工具类如下
import java.security.Security;
import java.util.Locale;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.util.encoders.Base64;
/**
* AES加密解密字符串工具类
* 概述:AES高级加密标准,是对称密钥加密中最流行的算法之一;
* 工作模式包括:ECB、CBC、CTR、OFB、CFB;
* 使用范围:该工具类仅支持CBC模式下的:
* 填充:PKCS7PADDING
* 数据块:128位
* 密码(key):32字节长度(例如:12345678901234567890123456789012)
* 偏移量(iv):16字节长度(例如:1234567890123456)
* 输出:hex
* 字符集:UTF-8
* 使用方式:String encrypt = AESCBCUtil.encrypt("wy");
* String decrypt = AESCBCUtil.decrypt(encrypt);
* 验证方式:http://tool.chacuo.net/cryptaes(在线AES加密解密)
*/
public class AESCBCUtil {
//密码
private static final String key = "12345678901234567890123456789012";
//iv偏移量
private static final String iv = "1234567890123456";
/**
* 加密:对字符串进行加密,并返回十六进制字符串(hex)
*
* @param encryptStr 需要加密的字符串
* @return 加密后的十六进制字符串(hex)
*/
public static String encrypt(String encryptStr, String key, String iv) {
try {
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
/**
* 这个地方调用BouncyCastleProvider
*让java支持PKCS7Padding
*/
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec);
byte[] encrypted = cipher.doFinal(encryptStr.getBytes());
byte[] encode = Base64.encode(encrypted);
String string = new String(encode);
return string;
// return byte2HexStr(encrypted);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 解密:对加密后的十六进制字符串(hex)进行解密,并返回字符串
*
* @param encryptedStr 需要解密的,加密后的十六进制字符串
* @return 解密后的字符串
*/
public static String decrypt(String encryptedStr, String key, String iv) {
try {
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec);
byte[] decode = Base64.decode(encryptedStr);
// byte[] bytes = hexStr2Bytes(encryptedStr);
byte[] original = cipher.doFinal(decode);
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 十六进制字符串转换为byte[]
*
* @param hexStr 需要转换为byte[]的字符串
* @return 转换后的byte[]
*/
public static byte[] hexStr2Bytes(String hexStr) {
/*对输入值进行规范化整理*/
hexStr = hexStr.trim().replace(" ", "").toUpperCase(Locale.US);
//处理值初始化
int m = 0, n = 0;
int iLen = hexStr.length() / 2; //计算长度
byte[] ret = new byte[iLen]; //分配存储空间
for (int i = 0; i < iLen; i++) {
m = i * 2 + 1;
n = m + 1;
ret[i] = (byte) (Integer.decode("0x" + hexStr.substring(i * 2, m) + hexStr.substring(m, n)) & 0xFF);
}
return ret;
}
/**
* byte[]转换为十六进制字符串
*
* @param bytes 需要转换为字符串的byte[]
* @return 转换后的十六进制字符串
*/
public static String byte2HexStr(byte[] bytes) {
String hs = "";
String stmp = "";
for (int n = 0; n < bytes.length; n++) {
stmp = (Integer.toHexString(bytes[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs;
}
}
5.问题
一、java.security.InvalidKeyException Illegal key size
环境JDK1.8
1、到以下网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8得到包jce_policy-8.zip
2、解决jce_policy-8.zip将里面的local_policy.jar和US_export_policy.jar复制并覆盖%JAVA_HOME%/jre/lib/security下的local_policy.jar和US_export_policy.jar