java 和 php 的AES 128位 256位 加解密 【java解密php的AES加密方案】

ops/2024/9/19 18:45:55/ 标签: java, php, AES, 128, 256, 加密, 解密

项目需要 需要java可以解密 php加密的 字符串 ,
使用的方法是 AES128位加解密

坑一踩完 ,还是直接上代码

java">package com.xxx.init.utils;import com.xxx.init.utils.BaseDataUtil;
import com.xxx.init.exception.xxxRuntimeException;
import com.xxx.init.out.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;import java.util.Base64;/*** User:Json* Date: 2024/4/23* **/
@Slf4j
public class AesHelper {/** aes 128*/public static String AES_128_ECB = "AES/ECB/PKCS5Padding";/** aes 256*/public static final String AES_256_ECB = "AES/256/ECB/PKCS5Padding"; // 使用 AES-256-ECB 模式//获取nacos配置文件下的密钥public static String checkSecretKey() {return checkSecretKey(BaseDataUtil.getSystemConfigNacos().getAes128Key());}//获取密钥public static String checkSecretKey(String secretKey) {if (StringUtils.isEmpty(secretKey)) {secretKey = BaseDataUtil.getSystemConfigNacos().getAes128Key();}if (StringUtils.isEmpty(secretKey)) {throw new xxxRuntimeException(ResultCode.AES_KEY_ERROR);}return secretKey;}public static String encrypt128(String data) {String secretKey = padToLengthBytes(checkSecretKey(), 16);return encrypt(data, secretKey, AES_128_ECB, null);}//加密方法,对数据进行加密,返回加密后的数据.public static String encrypt(String data, String secretKey, String method, String iv) {try {secretKey = checkSecretKey(secretKey);SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "AES");Cipher cipher = Cipher.getInstance(method); // 使用指定的加密模式if (StringUtils.isEmpty(iv)) {cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);} else {IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);}byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));//php那边 openssl_encrypt 返回值直接是 base64 然后拿到值后又base64_encode 一次// 所以 java 加密 也要base64 两遍 / 解密也一样 需要两遍return Base64.getEncoder().encodeToString(Base64.getEncoder().encodeToString(encryptedBytes).getBytes());} catch (Exception e) {log.error("【AES加密失败】:" + e.getMessage());throw new xxxRuntimeException(ResultCode.AES_ENCRYPT_ERROR);}}public static String decrypt128(String data) {String secretKey = padToLengthBytes(checkSecretKey(), 16);return decrypt(data, secretKey, AES_128_ECB, null);}//解密方法,对数据进行解密,返回解密后的数据.public static String decrypt(String data, String secretKey, String method, String iv) {try {secretKey = checkSecretKey(secretKey);SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "AES");Cipher cipher = Cipher.getInstance(method); // 使用指定的解密模式if (StringUtils.isEmpty(iv)) {cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);} else {IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);}//base64 解密两次byte[] decodedBytes = Base64.getDecoder().decode(new String(Base64.getDecoder().decode(data)));byte[] decryptedBytes = cipher.doFinal(decodedBytes);return new String(decryptedBytes);} catch (Exception e) {log.error("【AES解密失败】:" + e.getMessage());throw new xxxRuntimeException(ResultCode.AES_DECRYPT_ERROR);}}//如果密钥 不足16位 或者超过16位的 处理方案 保证和php 那边一样 php的openssl_encrypt会自动补全 java需要手动补全//input 要补全的字符串 , length 跟多少位补全  常用的 16位 32位public static String padToLengthBytes(String input, int length) {// 转换input为字节数组byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);// 如果输入的字节数大于指定长度,只取前指定长度字节;否则,补全到指定长度字节byte[] keyBytes = new byte[length];if (inputBytes.length > length) {System.arraycopy(inputBytes, 0, keyBytes, 0, length);} else {int paddingLength = length - inputBytes.length % length;byte[] paddedKeyBytes = new byte[inputBytes.length + paddingLength];System.arraycopy(inputBytes, 0, paddedKeyBytes, 0, inputBytes.length);keyBytes = paddedKeyBytes;}// 将keyBytes转换为字符串return new String(keyBytes, StandardCharsets.UTF_8);}public static void main(String[] args) {String encrypted = AesHelper.encrypt("哈哈,我是谁!",padToLengthBytes("11111",16),AES_128_ECB,null);String decrypted = AesHelper.decrypt("ZkN4UUoyL0RqOEtYYWJNblk2VjI3YjNjN3l4d0ZGSEYwc1J5WXNzZDlxVT0=",padToLengthBytes("111111",16),AES_128_ECB,null);System.out.println("加密值:" + encrypted);System.out.println("解密值:" + decrypted);}
}

如果疑问 php openssl_encrypt() 为什么加密后会直接base64 可以了解一下 openssl_encrypt 下面3个常量
所以java这边需要不需要 base64 两边取决于 php 用没用 下面三个常量

java">OPENSSL_RAW_DATA=1
OPENSSL_ZERO_PADDING=2
OPENSSL_NO_PADDING=3

结束


http://www.ppmy.cn/ops/20468.html

相关文章

前端框架编译器之模板编译

编译原理概述 编译原理:是计算机科学的一个分支,研究如何将 高级程序语言 转换为 计算机可执行的目标代码 的技术和理论。 高级程序语言:Python、Java、JavaScript、TypeScript、C、C、Go 等。计算机可执行的目标代码:机器码、汇…

C#技巧之窗体去鼠标化

简介 在窗体程序中不用鼠标,直接使用键盘完成想要的操作。 实现的方法有两种,一种是使用键盘上的Tab键使控件获得焦点,然后用enter键触发该控件上的事件(一般为click事件)。另一种是,为控件添加快捷键&am…

数据结构——二叉树的顺序存储(堆)(C++实现)

数据结构——二叉树的顺序存储(堆)(C实现) 二叉树可以顺序存储的前提堆的定义堆的分类大根堆小根堆 整体结构把握两种调整算法向上调整算法递归版本 非递归版本向下调整算法非递归版本 向上调整算法和向下调整算法的比较 我们接着…

图像处理ASIC设计方法 笔记18 轮廓跟踪算法的硬件加速方案

目录 1排除伪孤立点(断裂链表)方法1 限制链表的长度方法2 增加判断条件排除断裂链表方法3 排除不必要跟踪的轮廓(推荐用这个方法) P129 轮廓跟踪算法的硬件加速方案 1排除伪孤立点(断裂链表) 如果图像中某…

matlab学习006-使用matlab绘出系统的冲激响应和阶跃响应波形并求其冲激响应的数值解

目录 题目 1,绘出系统的冲激响应和阶跃响应波形 1)基础 2)效果 3)代码 2,求出t0.5s,1s,1.5s,2s时系统冲激响应的数值解。 1)基础 2)效果 ​☀ 3)代码 题目 已知描述某连续系…

RakSmart站群服务器租用注意事项科普

随着互联网的飞速发展,站群运营成为越来越多企业和个人的选择。而RakSmart作为知名的服务器提供商,其站群服务器租用服务备受关注。在租用RakSmart站群服务器时,源库建议有一些关键的注意事项需要特别留意,以确保服务器的稳定运行…

MFC实现ini配置文件的读取

MFC实现 ini 配置文件的读取1 实现的功能:点击导入配置文件按钮可以在旁边编辑框中显示配置文件的路径,以及在下面的编辑框中显示配置文件的内容。 1. 显示配置文件内容的编辑框设置 对于显示配置文件内容的 Edit Contorl 编辑框的属性设置如下&#x…

Pytorch实现线性回归模型

在机器学习和深度学习的世界中,线性回归模型是一种基础且广泛使用的算法,简单易于理解,但功能强大,可以作为更复杂模型的基础。使用PyTorch实现线性回归模型不仅可以帮助初学者理解模型的基本概念,还可以为进一步探索更…

每日OJ题_DFS回溯剪枝⑦_力扣77. 组合

目录 力扣77. 组合 解析代码 力扣77. 组合 77. 组合 难度 中等 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,…

纯血鸿蒙APP实战开发——自定义路由栈管理

介绍 本案例将介绍如何使用路由跳转返回时获取到来源页的模块名以及路径名,在实际场景中同一页面通常会根据不同来源页展示不同的UI。 使用说明 无特殊使用说明,其他使用说明参考动态路由的相关说明 实现思路 路由来源页的实现 新增来源页字段 ex…

Git系列:Refs与Reflog

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

vscode 、eslint、prettier 的孽缘

今天在配置一个新项目的时候,被一个新项目搞得头痛。 我准备配置 prettier 来格式代码,然后把 prettier 添加到 eslint 规则中,这样控制台就能很好的展示那些代码格式有问题。可是控制台的错误和 vscode 显示的错误一直不一样,无…

STM32H7使用FileX库BUG,SD卡挂载失败

问题描述: 使用STM32H7ThreadXFileX,之前使用swissbit牌的存储卡可正常使用,最近项目用了金士顿的存储卡,发现无法挂载文件系统。 原因分析: 调试过程发现,关闭D-Cache可以挂载使用exfat文件系统。 File…

Python使用TinyDB

TinyDB是一个json实现的小型数据库; 官方文档地址:https://tinydb.readthedocs.io/en/latest/index.html 这里有一份非常全面的教程:https://www.cnblogs.com/watalo/p/12343260.html 下边是我的代码片段记录,实现了动态构建Query…

Spring Boot集成Mybatis Plus快速入门Demo

1.什么事Mybatis Plus? MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入:只做增强不…

Pycharm:常用插件安装和使用

简介:好用的插件可以美化界面或者提升效率,使工作事半功倍。 推荐插件: 1、CSV插件:美化csv数据展示 2、Translation:翻译的插件,可以进行中英互译 3、CodeGlance:代码小地图 4、Markdown …

PHP EOF(heredoc) 使用说明

在PHP中,EOF(End Of File)或heredoc是一种定义字符串的方法,它允许你跨越多行来定义字符串,而无需使用大量的引号或字符串连接符。这在编写多行文本、SQL查询或HTML内容时特别有用。 使用heredoc的基本语法如下&#…

《架构风清扬-Java面试系列第25讲》聊聊ArrayBlockingQueue的特点及使用场景

ArrayBlockingQueue是BlockingQueue接口的一个实现类之一 这个属于基础性问题,老规矩,我们将从使用场景和代码示例来进行讲解 来,思考片刻,给出你的答案 1,使用场景 实现:基于数组实现的有界阻塞队列&…

域防火墙策略同步、不出网隧道上线

背景 域内用户主机被限制 TCP 出网,其中规则为出站规则,安全研究者通过入站取得 SHELL 权限,需要对其进行上线控制。 思路:正向连接&隧道技术 如果是入站被限制呢?反向连接&隧道技术也可以解决(…

远程连接docker,实现本地发布版本到服务器

最近在学jenkins的时候,发现涉及到了docker的远程发布调用。后续应该还要自己搭建一个docker的本地仓库。 简单描述一下具体是如何实现的: 1、将docker的服务器开启2375端口(注意,这里的开启是将端口直接暴露出去,不用…