Java 实现 AES 对称加密算法的加解密

2023-11-11

前言

文章字数比较多,可直接查看代码:源码地址,文中描述有误的地方欢迎各位大神指导。

一、对称加密算法简介

1.对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

对称加密特点:

  • 加密速度快,可以加密大文件。
  • 密文可逆,一旦密钥文件泄漏,就会导致数据暴露。
  • 加密后编码表找不到对应字符会出现乱码。
  • 一般结合Base64使用。

2.加密模式

ECB

ECB(Electronic codebook):电子密码本,需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。

  • 优点 : 可以并行处理数据。
  • 缺点 : 同样的原文生成同样的密文,不能很好的保护数据。

CBC

CBC(Cipher-block chaining):密码块链接,每个明文块先与前一个密文块进行异或,然后再进行加密,在这种方法中,每个密文块都依赖于它前面的所有明文块。

  • 优点 : 同样的原文生成的密文不一样。
  • 缺点 : 串行处理数据。

3.填充模式

当需要按块处理的数据,数据长度不符合块处理需求时,按照一定的方法填充满块长的规则。

NoPadding

  • 不填充,在AES加密算法下,要求原文长度必须是16byte的整数倍。

PKCS5Padding

  • 数据块的大小为8位不够就补足。

二、AES 加解密代码实例

1.生成 AES 密钥

  • AES 密钥长度默认只支持128、192、256 这三种长度,不合法的密钥长度程序会抛出异常。
  • 生成 AES 密钥时会使用到随机数生成器,可以指定不同的随机数算法,也可以在创建随机数生成器时指定 seed。
  • 初始化算法生成器时,如果不指定随机数生成器默认使用 new SecureRandom()。

代码如下:

    public static SecretKey generateAESKey(int keysize) {
        try {
            // 校验密钥长度
            if (keysize != AES_KEY_SIZE_128 && keysize != AES_KEY_SIZE_192 && keysize != AES_KEY_SIZE_256) {
                keysize = AES_KEY_SIZE_128;
            }
            // 创建安全随机数生成器(SHA1PRNG)
            SecureRandom random = SecureRandom.getInstance(RNG_ALGORITHM);
            // 创建 AES 算法生成器(AES)
            KeyGenerator generator = KeyGenerator.getInstance(AES_ALGORITHM);
            // 初始化算法生成器
            generator.init(keysize, random);
            return generator.generateKey();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

2.AES 加解密

TODO

代码如下:

    /**
     * AES 加密
     *
     * @param aseKey 密钥
     * @param plain  加密原文
     * @return 密文
     */
    public static byte[] aesEncrypt(byte[] aseKey, byte[] plain) {
        try {
            SecretKey secretKey = new SecretKeySpec(aseKey, AES_ALGORITHM);
            // AES
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            return cipher.doFinal(plain);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * AES 解密
     *
     * @param aseKey    AES 密钥
     * @param encrypted 解密密文
     * @return 原文
     */
    public static byte[] aesDecrypt(byte[] aseKey, byte[] encrypted) {
        try {
            SecretKey secretKey = new SecretKeySpec(aseKey, AES_ALGORITHM);
            // AES
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            return cipher.doFinal(encrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

3.AES + nonce 加解密

注意在使用 nonce 时,nonce 的长度不能超过 128,不然程序会抛出异常。

代码如下:

    /**
     * AES 加密
     *
     * @param aseKey AES 密钥
     * @param plain  加密原文
     * @param nonce  随机值
     * @return 密文
     */
    public static byte[] aesEncrypt(byte[] aseKey, byte[] plain, byte[] nonce) {
        try {
            // AES
            SecretKey secretKeySpec = new SecretKeySpec(aseKey, AES_ALGORITHM);
            // 获取 AES 密码器(AES/GCM/PKCS5Padding)
            Cipher cipher = Cipher.getInstance(AES_GCM_ALGORITHM);
            GCMParameterSpec zeroIv = new GCMParameterSpec(128, nonce);
            // 初始化密码器(加密模型)
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, zeroIv);
            return cipher.doFinal(plain);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
        /**
     * AES 解密
     *
     * @param aseKey    AES 密钥
     * @param encrypted 解密密文
     * @param nonce     随机值
     * @return 原文
     */
    public static byte[] aesDecrypt(byte[] aseKey, byte[] encrypted, byte[] nonce) {
        try {
			// AES
            SecretKeySpec secretKeySpec = new SecretKeySpec(aseKey, AES_ALGORITHM);
			// 获取 AES 密码器(AES/GCM/PKCS5Padding)
            Cipher cipher = Cipher.getInstance(AES_GCM_ALGORITHM);
            GCMParameterSpec zeroIv = new GCMParameterSpec(128, nonce);
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, zeroIv);
            return cipher.doFinal(encrypted);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 获取随机值
     *
     * @param len 随机值长度
     * @return
     */
    public static byte[] generatorNonce(int len) {
        byte[] values = new byte[len];
        SecureRandom random = new SecureRandom();
        random.nextBytes(values);
        return values;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 实现 AES 对称加密算法的加解密 的相关文章

  • Element UI 的输入框

    Input 输入框 通过鼠标或键盘输入字符 Input el input 为受控组件 它总会显示 Vue 绑定值 通常情况下 应当处理 input 事件 并更新组件的绑定值 或使用v model 否则 输入框内显示的值将不会改变 不支持 v
  • css line-height小酌

    1 行高的实际应用 1 1 一个空的div 打开浏览器看什么都会没有 给他嵌套个字体啊 就能撑开啊 好 兄弟来 试试看看行不行 div line height 0 background f00 或 div font size 0 backg
  • CTF系列之Web——SQL注入

    前言 在刚学习SQL注入的过程中非常艰难 查资料的时间有一周这么长 点开的网页也不下一千 认真读的也最少有两百 可是能引导入门的真的没几篇 都是复制来复制去的 没意思 感觉就是在浪费时间 有很多知识点都很散 很少能考到一片吧所有知识点总结在
  • Hutool-core 核心------cn.hutool.core.bean包下的DynaBean、BeanDesc、BeanDesc.PropDesc、BeanPath、BeanUtil、

    1 DynaBean 动态Bean 封装实例对象 进行反射调用 2 BeanDesc Bean信息描述做为BeanInfo替代方案 3 BeanDesc PropDesc 属性描述 4 BeanPath Bean路径表达式对象 用于属性检
  • FPGA面试真题解析(2)

    5 下面哪种不是组合逻辑电路功能描述方法 硬件逻辑实习岗 A 真值表 B 布尔方程 C 状态机 D 逻辑框图 解析 考察数字电路中对组合逻辑电路的认识 A选项真值表是使用于逻辑中的一类数学用表 用来计算逻辑表示式在每种论证 即每种逻辑变量取
  • C++学习--cin不支持录入空格

    https blog csdn net EXLsunshine article details 28440629 举个栗子 当使用cin功能然后键盘输入 aaa bbb ccc 时 cin的那个字符串只会保留 aaa
  • Apache解析漏洞

    Apache解析漏洞主要是因为Apache默认一个文件可以有多个用 分割得后缀 当最右边的后缀无法识别 mime types文件中的为合法后缀 则继续向左看 直到碰到合法后缀才进行解析 以最后一个合法后缀为准 1 如图 最后一个后缀名为 x
  • IPC:消息队列

    消息队列 gcc messageQueue c o mq lrt mqd t mq send mqd t mqdes const char msg ptr size t msg len unsigned msg prio msg prio
  • OpenCV 实现读取摄像头、视频读取保存 (C++)

    一 读取摄像头 重点语句 VideoCapture imshow 原理 使用VideoCapture语句读取摄像头 再利用while一次次将VideoCapture所读取的数据利用imshow语句一帧帧地读取出来 include
  • 基于多任务学习和GCN的交通路网出租车需求预测

    1 文章信息 文章题目为 Multitask Learning and GCN Based Taxi Demand Prediction for a Traffic Road Network 是一篇发表在Sensors期刊上的有关基于多任务
  • 解决vista和win10在windows服务中交互桌面权限问题:穿透Session 0 隔离

    服务 Service 对于大家来说一定不会陌生 它是Windows 操作系统重要的组成部分 我们可以把服务想像成一种特殊的应用程序 它随系统的 开启 关闭 而 开始 停止 其工作内容 在这期间无需任何用户参与 Windows 服务在后台执行
  • python数据分析面试_python数据分析面试

    1 如何利用SciKit包训练一个简单的线性回归模型 利用linear model LinearRegression 函数 Create linear regression object regr linear model LinearRe
  • vs code配置c语音环境

    要在VS Code中配置C语言环境 您可以按照以下步骤进行操作 安装C C 扩展程序 在VS Code中 您可以通过搜索 C C 来找到C C 扩展程序 安装该扩展程序后 您可以在VS Code中使用C C 语言编写代码 创建C C 项目
  • C++入门-----拷贝构造

    学习目标 1 拷贝构造函数的概念及使用 2 特征 3 注意的点 3 1 防止无穷递归 3 2 防止原对象被修改 4 默认生成拷贝构造 4 1 浅拷贝 4 2 为什么要自己实现拷贝构造函数 4 3 其对于内置类型和自定义类型的处理方式 5 总
  • vue响应式数据-修改对象的属性值,视图不更新

    目录 bug复现 原因 怎么在console中判断是不是响应式数据 怎样才能设置为响应式数据 bug复现 在代码中给一个对象 新增多个属性并赋值 然后在另一个方法中修改对象其中一个属性的值 发现数据改变 页面视图并没有更新 data ret
  • 在Vue.js的public目录下的index.html文件中,可以使用EJS(Embedded JavaScript)模板语法来插入变量。

    这个示例中 和被用于插入对应的变量 这些变量将被EJS模板引擎根据环境和配置进行替换 同样 会将htmlWebpackPlugin插件的options title属性插入到
  • vue中动态水印

    效果 一 根元素div上增加 div class rootZhy div 二 增加方法 watermarkZhy content let container document body let width 120px let height
  • BeanCreationException: Error creating bean with name ‘configurationPropertiesBeans‘ defined in class

    1 现象 启动 SpringCloud项目时报错 2 解决方案 2 1 spring cloud dependencies添加到dependencyManagement标签
  • STM32开发(六)STM32F103 通信 —— RS485 Modbus通信编程详解

    上一篇 主目录 下一篇 文章目录 一 基础知识点 二 开发环境 三 STM32CubeMX相关配置 1 STM32CubeMX基本配置 2 STM32CubeMX RS485 相关配置 四 Vscode代码讲解 五 结果演示以及报文解析 六

随机推荐

  • Spring Boot 添加拦截器

    文章目录 Spring Boot 添加拦截器 方法1 新增拦截器 配置拦截器 方法2 新增拦截器 配置拦截器 拦截所有响应 Spring Boot 添加拦截器 介绍一下在Spring Boot 2 0 0以上版本如何添加拦截器 方法1 新增
  • html烟花代码在线编程,canvas实现烟花的示例代码

    前言 马上过年了 我打算在后台里面偷偷地埋个新春祝福 放烟花的彩蛋 项目是基于react typescript的 因此最后封装成了一个组件 设置好开启时间就可以显示了 目录结构 目录结构大致如下 我们将烟花分为两个阶段 一个是未炸开持续上升
  • Python不同excel的合并操作

    Python不同excel的合并操作 23333333333我的第一篇博客 有一点瞎搞的感觉 0 0 问题描述 对7个类似下图的Excel进行合并 合并的最终效果 Excel文件需要可以找我 技术分析 获取表格中相同格式的部分进行操作 对除
  • 华为OD机试真题 Java 实现【服务中心选址】【2023Q1 100分 】

    一 题目描述 一个快递公司希望在一条街道建立新的服务中心 公司统计了该街道中所有区域在地图上的位置 并希望能够以此为依据为新的服务中心选址 使服务中心到所有区域的距离的总和最小 给你一个数组 positions 其中 positions i
  • 苏宁图书爬虫第一版

    最近一直在忙于工作 当我知道这些都是借口 毕竟某些博主大佬深夜还在更新订阅号更新微博 或许这就是自制力的差距吧 不啰嗦了 今天要写的主要是一篇关于如何爬取 苏宁图书 当然只是半成品 但是大部分问题都已经解决 在这里记录一下发生过的问题 以免
  • 专题五 Redis高并发场景

    介绍 Redis高并发场景 如果直接去学会比较抓不住头绪 因此本文将一步步介绍Redis的高并发的步骤演进 首先解释synchronized不适合在分布式场景 因为synchronized只适用自身的JVM 因此在分布式场景下多台机器的情况
  • 用IEDA开发WEB项目发生的java.lang.NoClassDefFoundError解决方法

    编译的时发生了这个问题 然后上网上百度了一下 一下出自于别人的博客 一 第一种 也是新手容易犯的错误 那就是classpath环境变量配置错误 这个错误在我最开始学习Android的时候就遇到过 弄的焦头烂额的 解决办法 在系
  • 华为机试:计算某字母出现次数 (不区分大小写)

    一 题目 描述 写出一个程序 接受一个由字母 数字和空格组成的字符串 和一个字母 然后输出输入字符串中该字母的出现次数 不区分大小写 字符串长度小于500 输入描述 第一行输入一个由字母和数字以及空格组成的字符串 第二行输入一个字母 输出描
  • 【华为OD机试】数字最低位排序【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 给定一个非空数组 列表 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素 相对位置保持不变 当数组元素为负值时 十进制最低为等
  • 集合引用类型 下

    目录 Map Map set Map get Map delete Map has Map values Map entries Map clear 选择Object 还是Map 数据转换 转为数组 转为 JSON 对象转为 Map 数组转
  • 【Matlab】系统的响应分析

    前言 一个信号系统课程中使用Matlab对系统的零状态响应 零输入响应 完全响应 冲激响应 阶跃响应求解 波形生成以及分析的实验 一 内容 设系统的微分方程为 激励为 起始状态条件为 可求得 零输入响应 零状态响应 完全响应 冲激响应 阶跃
  • 攻防世界web新手题解题writeup

    攻防世界web新手题 1 view source 题目描述 X老师让小宁同学查看一个网页的源代码 但小宁同学发现鼠标右键好像不管用了 题目场景 http 220 249 52 133 58537初级题 按下F12查看网页源码得到flag 2
  • vue自定义指令实现复制功能

    思路 使用浏览器自带的execCommand使用Copy 但此方法只能是被选中的值才能进行复制粘贴 动态创建一个文本域 将拿到的文字放在文本域中 然后自动选中 再调用浏览器方法即可 提示 想要选中文本框的内容 有如下两个方法可以 方法一 通
  • 用python画一束满天星花朵,python满天星绘制流程图

    大家好 小编来为大家解答以下问题 用python画一束满天星花朵 python满天星绘制流程图 今天让我们一起来看看吧 1 用python画一百个同心圆的代码 import matplotlib pyplot as plt from mat
  • u盘文件删除如何恢复呢?

    相信很多上班族都有自己的u盘 u盘是用来储存一些我们可以随身携带的数据的 无论是学习还是工作 只要用电脑 都需要使用u盘 而u盘就是一个小容器 可以装一些重要的文件 方便我们随身携带 当u盘里的文件在使用u盘的过程中不小心被删除了 怎么恢复
  • selenium的安装及使用介绍

    R爬虫之上市公司公告批量下载 selenium的安装及使用介绍 http yphuang github io blog 2016 03 01 Get Listed Company Announcement
  • 【超简单】使用TensorFlow训练和部署图像分类模型

    一 简介 使用TensorFlow和OpenCV实现图像分类 按照流程图运行程序 可以非常简便地完成图像预处理 生成数据集 训练模型和部署模型 四个程序的功能如下 preprocess py 对图像进行重命名和调整大小 建议拍摄形状为正方形
  • 数据流图学习

    数据流图或数据流程图 Data Flow Diagram 缩写为DFD 是什么 数据流图是结构化分析方法中使用的工具 它以图形的方式描绘数据在系统中流动和处理的过程 由于它只反映系统必须完成的逻辑功能 所以它是一种功能模型 标志了一个系统的
  • JavaScript中apply()和call()的区别和应用

    JavaScript中的每一个Function对象都有一个apply 方法和一个call 方法 这两个方法能够改变函数体内部 this 的指向 例如 fun1 call 或者fun1 apply 都是为了改变fun1函数内部的this指向
  • Java 实现 AES 对称加密算法的加解密

    Java 实现 AES 对称加密算法的加解密 前言 一 对称加密算法简介 1 对称加密 2 加密模式 3 填充模式 二 AES 加解密代码实例 1 生成 AES 密钥 2 AES 加解密 3 AES nonce 加解密 前言 文章字数比较多