java实现AES256对称加解密工具类

news2024/11/20 20:30:56

一、引入依赖包

  • 引入相关依赖包

    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.70</version>
    </dependency>
    <!--lombok用于简化实体类开发-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    

二、AES256对称加解密工具类

  • AES256对称加解密工具类代码

    package com.xz.util;
    
    
    import lombok.extern.slf4j.Slf4j;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.bouncycastle.util.encoders.Base64;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.security.Security;
    
    /**
     * @author: xz
     * @since: 2024/1/11 23:03
     * @description:
     */
    @Slf4j
    public class AES256Util {
    
        /**
         * 32位长度随机密码key
         */
        private static final String PASSWORD = "MEqLCnG2Q0IfauMDbZq1lP46uP4BHsiv";
    
        /**
         * AES256加密
         * @param content
         * @return
         */
        public static String encrypt(String content) {
            try {
                if(content == null) {
                    return "";
                }
                //根据给定的字节数组构造一个密钥。enCodeFormat:密钥内容;"AES":与给定的密钥内容相关联的密钥算法的名称
                SecretKeySpec key = new SecretKeySpec(PASSWORD.getBytes(StandardCharsets.UTF_8), "AES");
                //将提供程序添加到下一个可用位置
                Security.addProvider(new BouncyCastleProvider());
                //创建一个实现指定转换的 Cipher对象,该转换由指定的提供程序提供。
                //"AES/ECB/PKCS7Padding":转换的名称;"BC":提供程序的名称
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    
                cipher.init(Cipher.ENCRYPT_MODE, key);
                byte[] byteContent = content.getBytes("utf-8");
                byte[] cryptograph = cipher.doFinal(byteContent);
                return new String(Base64.encode(cryptograph));
            } catch (Exception e) {
                log.error("AES256 加密失败:", e.getMessage());
            }
            return null;
        }
    
        /**
         * AES256解密
         * @param cryptograph
         * @return
         */
        public static String decrypt(String cryptograph) {
            try {
                if(cryptograph == null) {
                    return "";
                }
                SecretKeySpec key = new SecretKeySpec(PASSWORD.getBytes(StandardCharsets.UTF_8), "AES");
                Security.addProvider(new BouncyCastleProvider());
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    
                cipher.init(Cipher.DECRYPT_MODE, key);
                byte[] content = cipher.doFinal(Base64.decode(cryptograph));
                return new String(content);
            } catch (Exception e) {
                log.error("AES256 解密失败:", e.getMessage());
            }
            return null;
        }
    }
    

三、测试类

  • 测试代码

    package com.xz.util;
    /**
     * @author: xz
     * @since: 2024/1/11 23:07
     * @description:
     */
    public class AES256UtilTest {
        public static void main(String[] args) {
            String str="hello 编号 007!";
            System.out.println("原始内容:"+str);
    
            String encrypt = AES256Util.encrypt(str);
            System.out.println("加密后的内容:"+encrypt);
    
            String decrypt = AES256Util.decrypt(encrypt);
            System.out.println("解密后的内容:"+decrypt);
    
        }
    }
    
  • 测试输出结果
    在这里插入图片描述

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

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

相关文章

MySQL-索引回顾

索引是面试高频问答题&#xff0c;参考百度/CSDN/尚硅谷/黑马程序员/阿里云开发者社区&#xff0c;决定将索引知识回顾一下&#xff0c;忘记时&#xff0c;点开即可&#xff0c;时刻保持更新&#xff0c;事不宜迟&#xff0c;即刻享用。 索引概述 索引&#xff08;index&#…

2000-2021年全国各省环境相关指标数据(890+指标)

2000-2021年全国各省环境相关指标数据&#xff08;890指标&#xff09; 1、指标时间&#xff1a;2000-2021年 2、范围&#xff1a;31省市 3、来源&#xff1a;2001-2022年环境统计年鉴 4、指标&#xff1a;工业废水排放总量、工业废水排放达标量、工业废水处理量、化学需氧…

离散数学3

补变元 解释&#xff1a;它是以反^作为一组一组的&#xff0c;因此&#xff0c;对于P反^Q来说&#xff0c;P是一组&#xff0c;Q是一组&#xff0c;又有以下&#xff1a;对缺少变元的项要补齐&#xff0c;P缺少Q&#xff0c;Q缺少P。因此&#xff0c;补齐。 用分配律展开 解释&…

基于Vue组合式API的实用工具集

简介 今天,给大家分享一个很实用的工具库 VueUse,它是基于 Vue Composition Api,也就是组合式API。支持在Vue2和Vue3项目中进行使用,据说是目前世界上Star最高的同类型库之一。 图片 官方地址:https://vueuse.org/ 中文地址:https://www.vueusejs.com/ github:https…

深度解析Cron表达式:精确控制任务调度的艺术

深度解析Cron表达式&#xff1a;精确控制任务调度的艺术 希望我们都可以满怀期待的路过每一个转角 去遇见 那个属于自己故事的开始 去追寻那个最真实的自己 去放下 去拿起 安然&#xff0c;自得&#xff0c;不受世俗牵绊… 导言 在计算机科学领域&#xff0c;任务调度是一项关…

RabbitMQ(六)消息的持久化

目录 一、简介1.1 定义1.2 消息丢失的场景 二、交换机的持久化方式一&#xff1a;直接 new方式二&#xff1a;channel.exchangeDeclare()方式三&#xff1a;ExchangeBuilder【推荐】 三、队列的持久化方式一&#xff1a;直接 new方式二&#xff1a;channel.queueDeclare()方式三…

【算法Hot100系列】组合总和

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

回首24考研历程,那些无法忘却的收获

文章目录 毅力与坚持&#x1f44d;知识的力量&#x1f9d0;心态的历练&#x1f913;友谊与互助( •̀ ω •́ )y未来的启示(●◡●) 在这个充满希望与挑战的时刻&#xff0c;我想与你们分享一段关于2023这一年特别的经历——考研之路。这段旅程既有磨砺的痛楚&#xff0c;也有…

基础篇_快速入门(Java简介,安装JDK,cmd命令行运行Java文件产生乱码问题的解决方式,IDE工具,实用工具)

文章目录 一. Java 简介1. JVM2. JRE3. JDK 二. 安装 JDK1. 下载和安装2. 配置 Path3. 配置 JAVA_HOME&#xff08;选讲&#xff09;优化 三. 入门案例1. 第一行代码1) jshell2) 代码解读总结 3) 为何要分成对象与方法 2. 第一份源码1) 源码结构2) 编写 java 源代码3) 编译 jav…

Python基础知识:整理10 异常相关知识

1 异常的捕获 1.1 基础写法 """基本语法&#xff1a;try:可能发生错误的代码except:如果出现异常&#xff0c;将执行的代码""" try:fr open("D:/abc.txt", "r", encoding"utf-8") except:print("出现异常…

1小时收到几百份简历

最近一直在招人&#xff0c;一些情况我也在星球群里也说了&#xff0c;目前找工作的人确实很多&#xff0c;只要发布职位&#xff0c;几百号人来投简历。 因为我本身带学员&#xff0c;之前我说我在boss上基本上都会回&#xff0c;但后来我让求职者总结自己的优势点时候发现&am…

C语言发展史

前言 当前&#xff0c;C语言是大学广泛应用的计算机教学语言之一&#xff0c;除了文科类专业&#xff0c;大部分理工科专业都会教授C语言&#xff0c;但是&#xff0c;C语言是谁搞出来的&#xff1f;是怎么编译的?相信很多同学对此并不清楚&#xff0c;今天&#xff0c;我们就…

【.NET Core】可为null类型详解

【.NET Core】可为null类型详解 文章目录 【.NET Core】可为null类型详解一、概述二、可为空的值类型2.1 声明和赋值2.2 检查可为空值类型2.3 基础类型与可为空的值类型互换2.4 可为空的值类型装箱和取消装箱2.5 如何确定可为空的值类型 三、可为 null 的引用类型 一、概述 nu…

IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理?

环境 戴尔R420 服务器 1U 2台直连存储 4U CentOS 7 问题描述 IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理? 服务器上电开机就出现进入紧急模式 Welcome to emergency mode! After logging in, type “journalctl …

Windows VSCode 使用Python

一、vscode中安装python 二、下载python.exe&#xff08;即vscode中需要的python解释器&#xff09; 下载地址&#xff1a;https://www.python.org/downloads/ 三、安装第三方代码规范工具 参考网址&#xff1a;https://www.python.org/downloads/ 工具介绍 flake8 &#xf…

starrocks权限管理-2.3.2版本

1.新用户创建以及授权 1.创建用户&#xff08;未分配角色&#xff09; -- 使用明文密码创建用户&#xff0c;允许其从 172.25.20.1 登陆。如果172.25.20.1被%替换就是所有ip都可以访问 CREATE USER bigdata172.25.20.1 IDENTIFIED WITH mysql_native_password BY Zhengda1; 不…

Redis Zset类型

Redis Zset类型 Zset&#xff08;有序集合&#xff09;它是集合的一种&#xff0c;不仅可以保存元素&#xff0c;还可以为每个元素关联一个 double 类型的分数&#xff08;score&#xff09;&#xff0c;Redis 正是通过分数来为集合中的元素进行从小到大的排序。在 Zset 中&am…

力扣LCR 166. 珠宝的最高价值(java 动态规划)

Problem: LCR 166. 珠宝的最高价值 文章目录 解题思路思路解题方法复杂度Code 解题思路 思路 改题目与本站64题实质上是一样的&#xff0c;该题目在64题的基础上将求取最小路径和改成了求取最大路径和。具体实现思路如下&#xff1a; 1.定义一个int类型的二维数组dp大小为给定…

跟着仙凡兄学习编译Telegram vs2022 2024.1.11编译成功

编译Telegram 本人花了两天&#xff0c;问官方作者终于编译成功Telegram 运行环境&#xff1a;win11 vs2022 参见学习视频&#xff1a;【telegram编译成功&#xff0c;编译遇到的各种问题】https://www.bilibili.com/video/BV11c411x7jm?vd_sourcedf2e51268cc7412cc3937cf3df2…

代码随想录第五十五天——判断子序列,不同的子序列

leetcode 392. 判断子序列 题目链接&#xff1a;判断子序列 确定dp数组及下标的含义 dp[i][j]&#xff1a;以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列长度为dp[i][j]确定递推公式 分为两种情况&#xff1a;s[i - 1] 与t[j - 1]相…