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

devtools/2024/9/19 18:58:18/ 标签: 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/devtools/14316.html

相关文章

通过阿里云OOS实现定时备份redis实例转储到OSS

功能背景 随着企业业务数据的快速增长,Redis 作为高性能的内存数据存储方案,在多种应用场景下承担着重要的角色。为确保数据安全,定时备份成为了不可或缺的一环。Redis 实例定时备份是关键数据库管理任务的一个重要组成部分,它主…

[巅峰极客 2022]smallcontainer

这题我认为是比较有思考意义的。 版本是2.27,有tcachebin,但大部分安全检测都没有。 直接看add函数。 不能得到fastbin,也不能直接0x410分配到unsortedbin了,并且最多同时存在16个chunk。 free后会把指针情况,没有ua…

3月黄油奶酪行业数据分析:安佳和妙可蓝多领军市场

近些年来,随着新消费主义盛行,老少皆宜的黄油和奶酪逐渐成为都市年轻人的烘培“新宠”。 今年3月份,黄油奶酪表现的中规中矩,处在稳定发展阶段。根据鲸参谋数据显示,3月份,在线上综合电商平台(…

AI助力科研创新与效率双提升:ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

为什么使用ZigBee协议开发智能家居产品?

随着智能家居市场的蓬勃发展,各种智能设备层出不穷,其中Zigbee技术因其独特的优势在这些智能设备中得到了广泛应用。那么,zigbee技术究竟具备哪些令人瞩目的优势,为什么能够得到如此广泛的应用呢? 如果您正计划利用Zi…

制作github.io学术个人主页

制作如图的学术个人主页。About me - Xianwen Ling’s Blog 学术个人主页是一个学者展示个人学术成果和研究方向的重要工具。个人主页可以集中展示学者的研究论文、出版物、演讲和发布的项目等学术成果,这样其他人可以更方便地了解和评估学者的研究贡献。个人主页可…

CNPM、NPM 和 Yarn:JavaScript 包管理器的比较

在现代Web开发中,包管理器是不可或缺的工具,它们帮助开发者管理项目中使用的各种第三方库。在JavaScript世界里,最常见的包管理器有 NPM、Yarn 和 CNPM。本文将详细介绍这三者的不同之处,并用简单的例子来帮助初学者理解每种工具的…

office的文件(word、excel、ppt)图标变白

之前用过WPS,后来卸载了,之后图标就变成白的了,但是word、Excel、PPT等都可以正常使用,说明不是打开方式的问题,然后就找问题所在。 看b站视频得知有可能是卸载wps之后,注册表里的图标路径仍然是之前的WPS…

【GitHub】github学生认证,使用copilot教程

github学生认证并使用copilot教程 写在最前面一.注册github账号1.1、注册1.2、完善你的profile 二、Github 学生认证 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅&a…

[Linux初阶]常见的指令

我们学Linux指令,其实就是和学windows一样,学习Linux的操作 一、Linux下基本指令 ls 指令 语法 : ls [ 选项 ] [ 目录或文件 ] 功能 :对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出…

大功率回馈式直流电子负载箱优点和应用

大功率回馈式直流电子负载箱是先进的电力设备,它能够模拟各种复杂的负载情况,对电源进行测试和校准。这种设备具有许多优点,被广泛应用于各种领域。 大功率回馈式直流电子负载箱具有高精度和高稳定性。它能够精确地模拟各种负载情况&#xff…

web前端框架设计第六课-样式绑定

web前端框架设计第六课-样式绑定 一.预习笔记 1.class属性绑定 给P标签绑定一个类样式,类名为active。当active取值为true时,表示绑定样式成功,取值为false时,取消绑定 以对象形式给P标签绑定多个类样式 以数组形式给P标签绑定多…

C脚本实现Wincc单按钮启动/停止

文章目录 前言实现步骤: 前言 在Wincc中实现单按钮启动/停止。即按一下,按钮关联的变量置位为1,再按一下,变量复位为0。 实现步骤: 在变量管理器新建变量"BF01_CP_HMI_SevName_Play";添加一个按…

爬虫学习笔记-数美验证

测试网址:智能验证码体验_图片验证码_数美科技数美科技智能验证码在线体验,智能识别风险用户级别,自行切换智能验证码难度及类型,提供滑动、拼图、点选、数字、动态等多种智能验证码服务,精准拦截机器行为。https://ww…

Flutter pod install 时提示Error installing GoogleUtilitiesComponents

设备:Mac air M3 2024 环境: Mac 14.4.1 Flutter 3.19.5 Android Studio 2023.2 在调用pod install安装插件时,前面成功了几个插件,后面停止在GoogleUtilitiesCompomponents上,等待一会儿后,出现 Err…

亚马逊云科技Amazon Bedrock大模型托管服务详细分析

说到2023年亚马逊云科技Re:invent 全球云计算大会最大更新,当属亚马逊云科技模型的大语言模型托管服务——Amazon Bedrock. Bedrock于两个月前正式发布,在本次大会后正式对用户可用。我们这次就来了解下该服务有什么亮点,和详细使用教程。由于…

SpringBoot---------整合Mybatisplus

快速入门 第一步&#xff1a;导入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency> 第二步&#xff1a;编写mapper…

vue cli3开发自己的插件发布到npm

具体流程如下&#xff1a; 1、创建一个vue项目 vue create project 2、编写组件 &#xff08;1&#xff09;新建一个plugins文件夹&#xff08;可自行创建&#xff09; &#xff08;2&#xff09;新建Button组件 &#xff08;3&#xff09;组件挂载&#xff0c;为组件提供 in…

js面试---闭包、作用域及作用域链、执行上下文

1、什么是闭包 闭包是指有权访问另一个函数作用域中变量的函数&#xff0c;创建闭包的最常见的方式就是在一个函数内创建另一个函数&#xff0c;创建的函数可以访问到当前函数的局部变量。 闭包的作用&#xff1a; a、使我们在函数外部能够访问到函数内部的变量。通过使用闭包…

介绍Phi-3:微软重新定义小型语言模型(SLM)的可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…