Aes-CBC-PKCS7Padding加密

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值