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

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

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

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 用没用 下面三个常量

OPENSSL_RAW_DATA=1
OPENSSL_ZERO_PADDING=2
OPENSSL_NO_PADDING=3

结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARCGIS PRO SDK POINT层唯一值渲染按角度旋转

c 代码: 按Direction字段旋转&#xff0c;旋转样式为数学 protected override async void OnClick(){var featLayer MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().First();await QueuedTask.Run(() >{var render featLayer.GetRenderer()…

Python异步编程详解:asyncio和多线程

Python 的异步编程是一种通过协程、事件循环和异步I/O操作来实现并发的技术。在 Python 中&#xff0c;asyncio 是用于编写单线程并发代码的库&#xff0c;而多线程则涉及使用 Python 的 threading 模块。下面我们将详细探讨这两种技术的使用和它们的适用场景。 ### 1. asynci…

6 Zookeeper 配置说明

Zookeeper 的三种工作模式 单机模式:存在单点故障。集群模式:在多台机器上部署 Zookeeper 集群,适合线上环境使用。伪集群模式:在一台机器同时运行多个 Zookeeper 实例,仍然有单点故障问题,当然其中配置的端口号要错开的,适合实验环境模拟集群使用。Zookeeper 的三种端口…

C 练习实例36 - 求100之内的素数

C 练习实例36 - 求100之内的素数 题目&#xff1a; 求100之内的素数。 程序分析&#xff1a; 质数&#xff08;prime number&#xff09;又称素数&#xff0c;有无限个。一个大于1的自然数&#xff0c;除了1和它本身外&#xff0c;不能被其他自然数整除。 程序源代码&#x…

Vue3+Vite开发的项目进行加密打包

本文主要介绍Vue3+Vite开发的项目如何进行加密打包。 目录 一、vite简介二、混淆工具三、使用方法1. 安装插件:2. 配置插件:3. 运行构建:4. 自定义混淆选项:5. 排除文件:下面是Vue 3+Vite开发的项目进行加密打包的方法。 一、vite简介 Vite 是一个由 Evan You 创造的现代…

XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台

XBoot&#xff1a;基于Spring Boot 2.x的一站式前后端分离快速开发平台 摘要 随着信息技术的迅速发展&#xff0c;快速构建高质量、高可靠性的企业级应用成为了迫切需求。XBoot&#xff0c;作为一个基于Spring Boot 2.x的一站式前后端分离快速开发平台&#xff0c;通过整合微信…

python_AI库 matplotlib在AI程序中的应用介绍

本文默认读者具备以下技能&#xff1a; 熟悉Python基础知识&#xff0c;能自行阅读并理解代码含义 对AI有基础了解 基础高等数学知识 前文对matplotlib在日常生活的基础应用作了介绍&#xff0c;那么matplotlib与我们的AI又有什么联系呢&#xff1f; 在 AI 程序中&#xff0c…

针对icon报错

针对上篇文章生成图标链接中图标报错 C# winfrom应用程序添加图标-CSDN博客 问题&#xff1a;参数“picture”必须是可用作Icon的参数 原因&#xff1a;生成的ico图标类型不匹配 解决方法&#xff1a; 更改导出的ico类型

iOS - 多线程-读写安全

文章目录 iOS - 多线程-读写安全1. 多读单写1.1 场景1.2 实现方案1.2.1 pthread_rwlock&#xff1a;读写锁1.2.1.1 示例 1.2.2 dispatch_barrier_async&#xff1a;异步栅栏调用1.2.2.1 示例 iOS - 多线程-读写安全 假设有一个文件&#xff0c;A线程进行读取操作&#xff0c;B…

数智时代的AI人才粮仓模型解读白皮书(2024版)

来源&#xff1a;极客邦科技 自 2023 年上半年起&#xff0c;ChatGPT 等大模型技术蓬勃发展&#xff0c;AI 技术不断突破边界&#xff0c;展现 出惊人的潜力和发展速度。从早期的逻辑推理、专家系统&#xff0c;到如今的深度学习、神经网络&#xff0c; AI 技术显著缩小了科学…

ASP.NET企业投资价值分析系统

摘 要 本文将影响股票投资价值的宏观因素、行业因素、企业内部等诸多因素予以量化分析&#xff0c;对钢铁板块和汽车板块各上市公司进行综合评估&#xff0c;为广大股民的投资方向和资金安全提供了有力的支持。本文还阐述了企业投资价值分析的必要性&#xff0c;说明了企业投…

K8s: 持久化存储之卷, NFS卷

卷 Volume 1 ) 概述 容器中的文件在磁盘上是临时存放的&#xff0c;这给容器中运行的特殊应用程序带来一些问题 首先&#xff0c;当容器崩溃时&#xff0c;kubelet 将重新启动容器&#xff0c;容器中的文件将会丢失——因为容器会以干净的状态重建其次&#xff0c;当在一个 Po…

分类算法——模型评估(八)

1混淆矩阵 在分类任务下&#xff0c;预测结果与正确标记之间存在四种不同的组合&#xff0c;构成混淆矩阵&#xff08;适用于多分类&#xff09; TP True Possitive FN False Negative 2精确率&#xff08;Precision&#xff09;与召回率&#xff08;Recall&#xff09; 精…

mysql-sql-练习题-2

日期topN 日期最值 topN 任意区间topN 每年温度top2建表排名函数万能公式&#xff08;条关&#xff09; 任意区间 各科第1,3,5名排名函数万能公式 日期 本周过生日 -- 本周表示 加减日期 格式化 拼接 select * from student where date_format(s_age,concat(year(curdate()),…

微信小程序开发六(自定义组件)

自定义组件的创建&#xff1a; 如何创建&#xff1a; 右键选择新建component 创建完成之后需要打开app.json&#xff0c;这是全局使用这个组件&#xff0c;想要单独的页面使用&#xff0c;就在当前页面的json文件中定义 "usingComponents": {"my-zj": &quo…

冰箱主控 32位MCU,多通道、高精度的AD采样配合温度传感器,实现冰箱各温室的精确控温;低功耗设计

概览 小华高性价比32位MCU&#xff0c;多通道、高精度的AD采样配合温度传感器&#xff0c;实现冰箱各温室的精确控温&#xff1b;低功耗设计&#xff0c;绿色低碳、节能环保&#xff1b;模块化设计&#xff0c;充分利用丰富的通讯接口&#xff0c;使主控板、显示板和驱动板灵活…

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

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

Windows设置右键打开管理员CMD

参考方法&#xff1a;Windows设置右键打开CMD - 知乎 (zhihu.com) 按参考方法创建右键CMD&#xff0c;在command默认项的数值数据中填入 powershell.exe -Command "Start-Process cmd -ArgumentList /s,/k,pushd \"%V\" -Verb RunAs"

GEE教程——初学者如何实现sentinel-1数据(哨兵1号SAR)VV和VH波段指定样本点的提取(值提取至点)

简介 要实现Sentinel-1数据VV和VH波段指定样本点的提取,可以按照以下步骤进行: 1. 首先,获取Sentinel-1数据。你可以从Copernicus Open Access Hub(https://scihub.copernicus.eu)或者其他数据提供商获取Sentinel-1数据。确保选择包含VV和VH波段的数据产品。 2. 将Sent…

38-1 防火墙了解

一、防火墙的概念: 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668 [A]1993-12-15)。它是一种位于内部网络与外部网络之间的网络安全系统,是一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。…