Java对称加密:AES 高级加密标准

1、对称加密简述

对称加密,又称对称密钥加密或私钥加密,是一种在加密和解密过程中使用相同一个密钥的加密算法。这种加密方式的核心在于,发送方使用某个密钥对数据进行加密,接收方则使用完全相同的密钥对数据进行解密。由于加密和解密使用的是同一把“钥匙”,因此得名“对称加密”。

对称加密是一种强大且高效的加密方式,但其安全性高度依赖于密钥的安全管理。因此,在实际应用中,需要采取额外的安全措施来保护密钥的安全,如使用密钥分发协议、密钥托管服务等。

对称加密的主要特点包括:

  1. 密钥管理:由于加密和解密使用相同的密钥,因此密钥的管理和分发成为了安全性的关键。如果密钥被泄露,加密的数据就可能被解密,从而导致信息泄露。
  2. 加密效率:对称加密算法通常具有较高的加密和解密速度,适用于处理大量数据。
  3. 安全性:许多对称加密算法,如 AES(高级加密标准),被设计为非常强大且难以破解,只要密钥保持安全。

常见的加密解密工具,如下图:

2、AES 算法:高级加密标准

AES(Advanced Encryption Standard),即高级加密标准,是一种对称加密算法,被广泛应用于信息安全领域,保护敏感信息的安全。以下是对AES算法的详细介绍:

2.1 基本原理

AES 算法基于迭代和分组密码设计,通过一系列的加密操作,将明文转化为密文。其加密流程主要包括字节代换、行移位、列混合和轮密钥加变换等步骤。解密过程为加密过程的逆过程。

2.2 密钥管理

AES 算法支持不同的密钥长度,分别为128位、192位和256位。密钥的长度决定了加密的轮数:

  • 128位密钥:加密轮数为10轮。
  • 192位密钥:加密轮数为12轮。
  • 256位密钥:加密轮数为14轮。

在加密过程中,密钥扩展模块用于生成每轮加密所需的轮密钥。这些轮密钥通过复杂的数学运算生成,确保了加密的安全性。

2.3 加密流程

  1. 字节代换:这是AES加密的第一步,通过一个查找表(S盒),将每个字节替换为另一个字节,从而实现对明文数据的混淆。
  2. 行移位:对经过字节代换后的4×4字节矩阵的每一行进行循环左移操作,不同行的移动位数不同,以此进一步打乱数据的顺序。
  3. 列混合:对矩阵的每一列进行特定的线性变换,使得每一列的数据都与其他列的数据相互关联,增加了密文的复杂性。
  4. 轮密钥加:将经过前面三步处理后的矩阵与当前轮的轮密钥进行异或操作。

AES算法在不同的加密模式下,轮数有所不同,一般情况下为10轮、12轮或14轮,这取决于密钥的长度。密钥长度可以是128位、192位或256位。在每一轮加密中,都会重复上述四个步骤(最后一轮无列混合变换)。

3、加密模式

AES 主要有两种加密模式:ECB(Electronic Codebook,电子密码本)与 CBC(Cipher Block Chaining,密码分组链接)是两种不同的加密模式,它们在处理明文块的方式上存在显著差异,从而影响了其安全性和适用场景。

3.1 ECB 模式(电子密码本)

工作原理:

在 ECB 模式中,明文被分成固定大小的块,每个块独立加密。

加密过程是通过同一个密钥和加密算法实现的,每个块都使用相同的密钥和加密算法进行加密。

优点:

  • 加密和解密过程相对简单。
  • 有利于并行计算。
  • 误差不会被传递。

缺点:

  • 安全性较低,由于相同的明文块会产生相同的密文块,因此攻击者可以通过分析密文块来推测明文块的内容,从而可能导致机密性的泄露。

适用场景:

  • 一般只用于加密数据块基本不重复,且较小的数据块进行加密操作。

3.2 CBC 模式(密码分组链接)

工作原理:

在 CBC 模式中,明文被分成固定大小的数据块,每个数据块分别与前一个块的加密结果进行异或运算,然后再进行加密。

第一个明文块在进行异或运算之前,需要与一个初始化向量(IV)进行异或运算。

优点:

  • 增加了加密的随机性和安全性。由于每个明文块都与前一个加密块相关,因此即使两个明文块相同,它们的密文块也会不同。
  • 防止了攻击者通过分析密文块来推测明文块的内容。

缺点:

  • 相对于 ECB 模式,CBC 模式更复杂,需要额外的初始化向量(IV)。
  • 在解密过程中,需要按照加密时的顺序依次解密每个块,因此解密过程相对较慢。

适用场景:

  • 常用于加密机密性较高的数据。
  • 适用于需要较高安全性的场景,如网络通信、金融交易等。

4、填充模式

在 AES 加密算法中,填充模式是一个重要的概念,它用于处理待加密数据长度不符合算法块大小要求的情况。PKCS5Padding 和 NoPadding 是 AES 算法中两种常见的填充模式。PKCS5Padding 填充模式通过添加填充字节来确保待加密数据的长度符合块大小要求,从而保证了加密过程的正确性和安全性。而 NoPadding 填充模式则不进行任何填充,要求待加密数据长度必须是块大小的整数倍。在实际应用中,应根据具体需求和安全要求选择合适的填充模式。

4.1 PKCS5Padding 填充模式

PKCS5Padding 填充模式是由 RSA 安全公司设计的一种填充方式,用于对数据的长度进行填充,以满足加密算法要求。在 AES 算法中,由于块大小为128位(即16字节),如果待加密的数据长度不是16的整数倍,就需要使用填充模式进行填充。

PKCS5Padding 填充模式的规则如下:

  • 计算输入数据的长度与块大小(16字节)之间的差值。
  • 根据这个差值,在输入数据的末尾添加相应数量的填充字节。
  • 每个填充字节的值都等于差值本身(即填充的字节数)。

例如,如果输入数据的长度为45字节(即距离下一个块大小还差11字节),则 PKCS5Padding 会在数据末尾添加11个值为 0x0B(即11的十六进制表示)的填充字节。

在解密过程中,PKCS5Padding 填充模式会首先检查填充字节的正确性,即验证填充字节的值是否等于填充的字节数。如果验证通过,则删除填充字节,得到原始的明文数据。

4.2 NoPadding 填充模式

与 PKCS5Padding 填充模式不同,NoPadding 填充模式不进行任何填充。它要求待加密的数据长度必须是块大小的整数倍(即16字节的整数倍)。如果数据长度不符合要求,则无法进行加密。

NoPadding 填充模式的优点在于它不需要额外的填充字节,从而减少了加密数据的长度。然而,这也限制了它的使用范围,因为在实际应用中,很难保证待加密的数据长度总是符合块大小的要求。

此外,需要注意的是,NoPadding 填充模式并不是所有AES工作模式都支持的。在AES的CBC(Cipher Block Chaining,密码分组链接)工作模式下,由于需要前一个密文块来加密当前明文块,因此不支持NoPadding填充模式。而在ECB(Electronic Codebook,电子密码本)和OFB(Output Feedback,输出反馈)等模式下,由于每个明文块都是独立加密的,因此可以支持NoPadding填充模式。但是,由于ECB模式存在安全性问题(如容易受到选择明文攻击),因此在实际应用中应谨慎使用。

5、综合实例

【实例】使用 AES 算法,实现  ECB 模式(电子密码本)和 CBC 模式(密码分组链接)的数据加密与解密。

5.1 创建 AES 对称加密工具类

package com.pjb.util;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;/*** AES 对称加密工具类* @author pan_junbiao**/
public class AESUtil
{//字符编码private final static String CHARSET_NAME = StandardCharsets.UTF_8.name();//算法private final static String ALGORITHM = "AES";//算法/加密模式/填充方式private static final String AES_ECB_PKCS5PADDING = "AES/ECB/PKCS5Padding";private static final String AES_CBC_PKCS5PADDING = "AES/CBC/PKCS5Padding";/*** 加密* 加密模式:ECB 电子密码本** @param data      原文数据* @param secretkey 密钥(密钥长度:32个字节)* @return 加密后的数据*/public static String encryptECB(String data, String secretkey){String result = null;try{//创建加密对象Cipher cipher = Cipher.getInstance(AES_ECB_PKCS5PADDING);//创建密钥对象SecretKey secretKey = getSecretKey(secretkey);//初始化加密对象(模式类型:加密模式)cipher.init(Cipher.ENCRYPT_MODE, secretKey);//执行加密方法byte[] bytes = cipher.doFinal(data.getBytes(CHARSET_NAME));//使用 Base64 编码,否则输出的结果是一串乱码result = Base64.getEncoder().encodeToString(bytes);return result;} catch (Exception ex){ex.printStackTrace();}return result;}/*** 解密* 加密模式:ECB 电子密码本** @param encodeData 加密数据* @param secretkey  密钥(密钥长度:32个字节)* @return 解密后的数据*/public static String decryptECB(String encodeData, String secretkey){String result = null;try{//创建解密对象Cipher cipher = Cipher.getInstance(AES_ECB_PKCS5PADDING);//创建密钥对象SecretKey secretKey = getSecretKey(secretkey);//初始化解密对象(模式类型:解密模式)cipher.init(Cipher.DECRYPT_MODE, secretKey);//使用 Base64 解码byte[] decodeBase64 = Base64.getDecoder().decode(encodeData.getBytes(CHARSET_NAME));//执行解密方法byte[] bytes = cipher.doFinal(decodeBase64);// 返回解密后的数据return new String(bytes);} catch (Exception ex){ex.printStackTrace();}return result;}/*** 加密* 加密模式:CBC 密码分组链接(更安全,但性能慢)** @param data      原文数据* @param secretkey 密钥(密钥长度:32个字节)* @param iv        向量(向量长度:16个字节)* @return 加密后的数据*/public static String encryptCBC(String data, String secretkey, String iv){String result = null;try{//创建加密对象Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5PADDING);//创建密钥对象SecretKey secretKey = getSecretKey(secretkey);//创建向量规范IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(CHARSET_NAME));//初始化加密对象(模式类型:加密模式)cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);//执行加密方法byte[] bytes = cipher.doFinal(data.getBytes(CHARSET_NAME));//使用 Base64 编码,否则输出的结果是一串乱码result = Base64.getEncoder().encodeToString(bytes);return result;} catch (Exception ex){ex.printStackTrace();}return result;}/*** 解密* 加密模式:CBC 密码分组链接(更安全,但性能慢)** @param encodeData 加密数据* @param secretkey  密钥(密钥长度:32个字节)* @param iv         向量(向量长度:16个字节)* @return 解密后的数据*/public static String decryptCBC(String encodeData, String secretkey, String iv){String result = null;try{//创建解密对象Cipher cipher = Cipher.getInstance(AES_CBC_PKCS5PADDING);//创建密钥对象SecretKey secretKey = getSecretKey(secretkey);//创建向量规范IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(CHARSET_NAME));//初始化解密对象(模式类型:解密模式)cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);//使用 Base64 解码byte[] decodeBase64 = Base64.getDecoder().decode(encodeData.getBytes(CHARSET_NAME));//执行解密方法byte[] bytes = cipher.doFinal(decodeBase64);// 返回解密后的数据return new String(bytes);} catch (Exception ex){ex.printStackTrace();}return result;}/*** 创建密钥对象** @param secretkey 密钥*/private static SecretKey getSecretKey(String secretkey) throws Exception{//判断密钥长度int keyLength = secretkey.length();if (keyLength != 32){throw new Exception("请使用长度为256位(即32字节)的密钥");}//生成密钥对象SecretKeySpec secretKey = new SecretKeySpec(secretkey.getBytes(CHARSET_NAME), ALGORITHM);return secretKey;}
}

5.2 使用 ECB 模式的加密与解密

/*** 使用 AES 对称加密* 加密模式:ECB 电子密码本*/
@Test
public void testAesECB()
{String data = "您好,欢迎访问 pan_junbiao的博客";String secretkey = "ABCDEFGHABCDEFGHABCDEFGHABCDEFGH";  //密钥(密钥长度:32个字节)//使用 AES 加密String encodeAES = AESUtil.encryptECB(data, secretkey);//使用 AES 解密String decodeAES = AESUtil.decryptECB(encodeAES, secretkey);//打印结果System.out.println("使用 AES 对称加密,加密模式为 ECB 电子密码本:");System.out.println("原始数据:" + data);System.out.println("AES加密:" + encodeAES);System.out.println("AES解密:" + decodeAES);
}

执行结果:

5.3 使用 CBC 模式的加密与解密

/*** 使用 AES 对称加密* 加密模式:CBC 密码分组链接(更安全,但性能慢)*/
@Test
public void testAesCBC()
{String data = "您好,欢迎访问 pan_junbiao的博客";String secretkey = "ABCDEFGHABCDEFGHABCDEFGHABCDEFGH";  //密钥(密钥长度:32个字节)String iv = "ABCDEFGH65412356";  //向量(向量长度:16个字节)//使用 AES 加密String encodeAES = AESUtil.encryptCBC(data, secretkey, iv);//使用 AES 解密String decodeAES = AESUtil.decryptCBC(encodeAES, secretkey, iv);//打印结果System.out.println("使用 AES 对称加密,加密模式为 CBC 密码分组链接(更安全,但性能慢):");System.out.println("原始数据:" + data);System.out.println("AES加密:" + encodeAES);System.out.println("AES解密:" + decodeAES);
}

执行结果:

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

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

相关文章

基于物联网的智慧考场系统设计(论文+源码)

1. 功能设计 (1)温度监测与控制功能: 系统需要能够实时采集考场内的温度信息,通过DS18B20传感器获取准确的数据,并在OLED屏幕和APP上显示。当温度异常过高时,系统应自动启动继电器,模拟空调开启…

数字IC后端实现 | Innovus各个阶段常用命令汇总

应各位读者要求,小编最近按照Innovus流程顺序整理出数字IC后端项目中常用的命令汇总。限于篇幅,这次只更新到powerplan阶段。有了这份Innovus常用命令汇总,学习数字IC后端从此不再迷路!如果大家觉得这个专题还不错,想继…

C语言_动态内存管理

本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0}…

Maven进阶——坐标、依赖、仓库

目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…

算法的学习笔记—数组中的逆序对(牛客JZ51)

😀前言 在算法和数据结构领域,"逆序对"是一个经典问题。它在数组中两个数字之间定义,若前面的数字大于后面的数字,则这两个数字组成一个逆序对。我们要做的就是,给定一个数组,找出数组中所有的逆…

Docker 镜像下载问题及解决办法

Docker 镜像下载问题及解决办法 我在杂乱的、破旧的村庄寂寞地走过漫长的雨季,将我年少的眼光从晦暗的日子里打捞出来的是一棵棵开花的树,它们以一串串卓然不俗的花擦明了我的眼睛,也洗净了我的灵魂。 引言 在使用 Docker 时,用户…

【AI绘画】Midjourney进阶:对角线构图详解

博客主页: [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯什么是构图为什么Midjourney要使用构图 💯对角线构图特点应用场景提示词书写技巧测试 💯小结 💯前言 【AI绘画】Midjourney进阶&a…

免费送源码:Java+MVC+HTML+CSS +MySQL 考研资料共享系统的设计与实现 计算机毕业设计原创定制

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设考研资料共享系统。 本…

Win10+MinGW13.1.0编译Qt5.15.15

安装windows SDK、python、ruby、cmake、Perl[可选]安装MySQL解压qt-everywhere-opensource-src-5.15.15.zip(注:不要使用qt-everywhere-opensource-src-5.15.15.tar.xz)修改源代码 E:\qt-everywhere-src-5.15.15\qtbase\src\3rdparty\angle\…

028_Comma_Separated_List_in_Matlab中的逗号分割列表

什么是逗号分割列表 这玩意一般都不知道是什么,Comma-separated list,CSL, 虽然,用Matlab的时候天天会用到。这到底是个什么玩意?或者,更进一步,这到底是不是个玩意? 每次调用一个…

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全(三) (columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性) 本文目录: 一、columns属性(设置元素的列宽和列数) 二、filter属性(调整图像、背景和边…

网络一些相关术语

目录 网络一些相关术语 转发平面效率 可扩展性 控制平面 网络拓扑 服务质量(QoS) 网络协议 网络带宽 网络拥塞 网络安全 网络冗余 网络切片 网络延迟 网络地址转换(NAT) 虚拟专用网络(VPN) …

网关三问:为什么微服务需要网关?什么是微服务网关?网关怎么选型?

文章整体介绍 本文旨在解答关于微服务网关的三个核心问题: 1)为什么需要网关?也即在何种场景下应采用微服务网关以优化系统架构; 2)什么是微服务网关?主要讲构成微服务网关的关键能力,包括但…

008:光盘映像文件处理工具UltraISO安装教程

摘要:本文详细介绍光盘映像文件处理工具UltraISO的安装流程。 一、软件介绍 UltraISO是一款功能强大的光盘映像文件处理工具,支持ISO文件的制作、编辑、转换、压缩、刻录以及启动盘制作,广泛应用于数据备份、软件分发和系统安装等领域。 二…

从GPT定制到Turbo升级再到Assistants API,未来AI世界,你准备好了吗?

引言 在OpenAI DevDay发布会上,OpenAI再次震撼整个人工智能行业,为AI领域带来了重大的更新。CEO Sam Altman宣布推出了定制版本的ChatGPT,这意味着用户现在可以根据自己的需求打造个性化的GPT,并分享至GPT Store。这一消息对于受…

神经架构搜索:自动化设计神经网络的方法

在人工智能(AI)和深度学习(Deep Learning)快速发展的背景下,神经网络架构的设计已成为一个日益复杂而关键的任务。传统上,研究人员和工程师需要通过经验和反复试验来手动设计神经网络,耗费大量时…

【MySQL】日志

1. 日志基本了解 常见的MySQL Server日志类型,以及记录的日志信息(场景通俗理解) 错误日志 记录的主要信息由服务器关闭、启动、崩溃事件;MySQL运行过程中出现的错误、警告和严重事件以及与权限、配置相关的问题使用场景 诊断MyS…

【Linux】【xmake】安装 + C/C++常用项目配置

文章目录 0. 环境准备1. 子命令create - 快速创建项目build - 构建程序config - 配置编译需要的参数show - 查看当前工程基本信息update - 程序自更新 2. C/C 项目常用配置2.1 项目目标类型2.2 添加宏定义2.3 头文件路径和链接库配置2.4 设置语言标准2.5 设置编译优化2.6 添加源…

光伏MPPT追踪的仿真设计

利用Simulink可实现如下功能:改变光照时有MPPT追踪并低电压穿越的能力。 MPPT控制器的全称为“最大功率点跟踪”(Maximum Power Point Tracking)太阳能控制器,检测主回路直流电压及输出电流,计算出太阳能阵列的输出功…

5.15 加载内核映像文件(1)

首先是 连接脚本与 实际的内核映像大小的关系: 关于ELF 格式的了解: 如何通过 ELF 头, 找到各个段。 网上的关于elf 的截图: 那么 segment 与 section 有什么区别呢? 也就是说, section值得是 单个C文件的…