import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Security;
public class AESUtil {
private static final String CIPHER_MODE = "AES/CBC/PKCS7Padding";
private static final String ENCRYPT_ALG = "AES";
/**
* HmacSha256 请求验签 加密
*
* @param data 加密内容
* @param key 加密key
*/
public static String sha256HMAC(String data, String key) throws Exception {
Mac hmacSHA256 = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
hmacSHA256.init(secretKey);
byte[] array = hmacSHA256.doFinal(data.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString();
}
/**
* 请求报文加密:有向量16位,结果转base64
*
* @param appSecret 加密密钥 128/192/256 bits
* @param aesIV 16位向量
* @param context 加密内容
*/
public static String encrypt(String appSecret, String aesIV, String context) throws Exception {
//下面这行在进行PKCS7Padding加密时必须加上,否则报错
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
byte[] content = context.getBytes(StandardCharsets.UTF_8);
Cipher cipher = Cipher.getInstance(CIPHER_MODE);
cipher.init(Cipher.ENCRYPT_MODE,
new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), ENCRYPT_ALG),
new IvParameterSpec(aesIV.getBytes(StandardCharsets.UTF_8)));
return Base64.encodeBase64String(cipher.doFinal(content));
}
/**
* 请求报文解密:有向量16位
*
* @param appSecret 解密密钥 128/192/256 bits
* @param aesIV 16位向量
* @param context 解密内容
*/
public static String decrypt(String appSecret, String aesIV, String context) throws Exception {
Cipher cipher = Cipher.getInstance(CIPHER_MODE);
cipher.init(Cipher.DECRYPT_MODE,
new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), ENCRYPT_ALG),
new IvParameterSpec(aesIV.getBytes(StandardCharsets.UTF_8)));
return new String(cipher.doFinal(Base64.decodeBase64(context)), StandardCharsets.UTF_8);
}
}
默认密钥支持128位如果是256位
会出现异常:Illegal key size异常
解决方法:
1.在 $JAVA_HOME/jre/lib/security/policy 文件夹,里面还有两个文件夹limited 和 unlimited;修改unlimited中的java.security
用文本编辑器打开java.security,并找到定义java安全性属性crypto.policy的行,它可以有两个值limited或unlimited,默认值是limited。
默认情况下,您应该能找到一条注释掉的行:
#crypto.policy=unlimited
取消注释即可;
2.下载新的jar包覆盖local_policy.jar、US_export_policy.jar两个jar包
jdk1.8版本:百度网盘 请输入提取码 提取码:9780
如果本地加密正常、打包代码部署到服务器异常org.bouncycastle.jce.provider.BouncyCastleProvider
1.需要导入依赖:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.69</version>
</dependency>