当前位置: 首页 > article >正文

java对接php系统的AES加密 但是提供的key不符合长度的PKCS7填充补全

假如使用的JDK1.8不支持PKCS7填充方式,需要添加依赖

<dependency>
   <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.64</version>
</dependency>

AESUtils

package com.hm.utils;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
import java.util.Base64;

public class AESUtils {

    private static final String transformation = "AES/CBC/PKCS7Padding";
    private static final String algorithm = "AES";

    public static String encrypt(byte[] key, byte[] initVector, String value) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector);
            SecretKeySpec skeySpec = new SecretKeySpec(key, algorithm);

            Cipher cipher = Cipher.getInstance(transformation);
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

            byte[] encrypted = cipher.doFinal(value.getBytes());

            return Base64.getEncoder().encodeToString(encrypted);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    public static String decrypt(String key, String initVector, String encrypted) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), algorithm);

            Cipher cipher = Cipher.getInstance(transformation);
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

            byte[] original = cipher.doFinal(Base64.getDecoder().decode(encrypted));

            return new String(original);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    // 对数据进行PKCS7补位
    public static byte[] addPKCS7Padding(byte[] keyByte, int blockSize) {
        int groups = keyByte.length / blockSize + (keyByte.length % blockSize != 0 ? 1 : 0);
        byte[] temp = new byte[groups * blockSize];
        Arrays.fill(temp, (byte) 0);
        System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
        keyByte = temp;
        return keyByte;
    }
}

package com.hm.utils.wms;

import com.hm.utils.AESUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.security.Security;

/**
 * WMS系统接口对接工具类
 *
 * @author Xu Wei
 * @version 1.0
 * @aate 2024/11/12 10:54
 */
@Component
public class WmsUtil {
    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public static void main(String[] args) {
        int client = 1; // 1表示风卡,2表示名家(这里只是模拟,实际应用中可能从其他地方获取这个值)
        String key = "123";

        byte[] temp = AESUtils.addPKCS7Padding(key.getBytes(), 32);

        String iv = "1234567890abcdef";
        String data = "data数据";
        System.out.println(AESUtils.encrypt(temp, iv.getBytes(StandardCharsets.UTF_8), data));
    }

}


http://www.kler.cn/a/397828.html

相关文章:

  • 软件测试 —— 自动化基础
  • Kafka新节点加入集群操作指南
  • 购物车demo全代码-对接支付宝沙箱环境
  • Go语言中的类型
  • 速通前端篇 —— HTML
  • ollama+springboot ai+vue+elementUI整合
  • 工化企业内部能源能耗过大 落实能源管理
  • unity 一个物体随键盘上下左右旋转和前进的脚本
  • 【鸿蒙开发】第十四章 Web组件的使用、基本属性与事件
  • leetcode 扫描线专题 06-leetcode.252 meeting room 力扣.252 会议室
  • LeetCode 90-子集Ⅱ
  • 高阶C语言补充:柔性数组
  • python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具
  • 机器学习-基本术语
  • html中select标签的选项携带多个值
  • 【EasyExcel】复杂导出操作-自定义颜色样式等(版本3.1.x)
  • 【因果分析方法】MATLAB计算Liang-Kleeman信息流
  • 网络物理隔离应用
  • 【JavaScript】LeetCode:96-100
  • 革新预测领域:频域融合时间序列预测,深度学习新篇章,科研涨点利器
  • 亚马逊云计算部门挑战英伟达,提供免费AI计算能力
  • 【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看
  • Linux TCP服务器客户端
  • Spring:bean的配置
  • XXL JOB DockerCompose部署
  • pytorch奇怪错误