AES介绍及在Java中使用AES进行加解密操作示例

news2024/12/22 21:24:47

前言

AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,它使用相同的密钥进行加密和解密。AES 算法广泛应用于保护数据的机密性,比如在文件加密、网络通信等领域。

AES分组模式

AES分组模式决定了如何将明文数据分成块进行加密,以及如何处理这些块之间的依赖关系。常见的AES分组模式包括:

  1. ECB(电子密码本模式,Electronic Codebook)‌:

    • 每个明文块独立加密,相同的明文块会产生相同的密文块。
    • 安全性较低,因为相同的明文块会产生相同的密文块,容易被攻击者利用。
    • 适用于小量数据的加密。
  2. CBC(密码分组链接模式,Cipher Block Chaining)‌:

    • 每个明文块在加密前会与前一个密文块进行XOR操作,需要一个初始向量(IV)。
    • 安全性较高,因为每个明文块都会依赖前一个密文块。
    • 广泛用于网络通信和数据存储。
  3. CFB(密文反馈模式,Cipher Feedback)‌:

    • 将块密码变成一个自同步流密码,不需要填充数据。
    • 每个明文块加密时会用到前一个密文块的反馈。
    • 适用于需要连续处理数据流的应用场景。
  4. OFB(输出反馈模式,Output FeedBack)‌:

    • 与CFB类似,但使用加密函数的输出作为反馈。
    • 安全性较高,因为每个明文块都是独立加密的,但依赖于一个初始向量。
    • 适用于需要高速加密的场景。
  5. CTR(计数器模式,Counter Mode)‌:

    • 每个明文块都与一个计数器值进行XOR操作,然后使用相同的密钥进行加密。
    • 可以并行处理数据块,因为每个明文块的加密是独立的。
    • 广泛应用于需要高吞吐量的加密场景。
  6. GCM(伽罗瓦/计数器模式,Galois/Counter Mode)‌:

    • 提供了数据加密和认证功能,确保数据的完整性和真实性。
    • 使用CTR模式进行加密,并结合GHASH函数进行认证。
    • 安全性高,适用于需要同时保证数据机密性和完整性的场景。

AES填充方式

AES加密时,数据块必须是固定大小(AES为128位,即16字节)的倍数。如果明文数据长度不是16字节的倍数,就需要进行填充。常见的AES填充方式包括:

  1. NoPadding‌:

    • 不进行填充,仅适用于数据长度已经是16字节倍数的情况。
    • 使用时较为受限,因为大多数数据长度都不是16字节的倍数。
  2. PKCS5Padding‌和‌PKCS7Padding‌:

    • PKCS7Padding是PKCS5Padding的扩展,支持填充块大小从1到255字节。
    • 对于AES(块大小为16字节)来说,PKCS5Padding和PKCS7Padding效果相同。
    • 填充原则是:如果原始加密数据块长度少于16个字节,则填充至16个字节,填充的值是缺少的字节数。如果原始加密数据块长度正好是16字节的倍数,则再增加一个16字节的块,每个字节都是16(用8位二进制表示,即00010000)。
  3. ISO10126Padding‌:

    • 最后一个字节是填充的字节数(包括最后一字节),其他字节填充随机数。
    • 安全性较高,因为填充的随机数增加了破解难度。
  4. ZerosPadding‌:

    • 用0填充至数据块大小的整数倍。
    • 安全性较低,因为填充模式固定且容易被预测。
  5. 其他填充方式‌:

    • 如ISO7816-4Padding、TBCPadding(Trailing-Bit-Compliment)等,这些填充方式在某些特定应用场景中使用。

在选择AES分组模式和填充方式时,应根据具体的应用场景和安全需求进行合理配置。例如,对于需要同时保证数据机密性和完整性的场景,可以选择GCM模式;对于需要高速加密的场景,可以选择CTR模式;对于数据长度不确定的情况,应选择合适的填充方式以确保数据块大小符合AES加密要求。

AES应用场景

AES的应用场景非常广泛,主要包括以下几个方面:

1. 金融行业‌:AES算法常用于保护银行卡交易、ATM机交易、电子支付等金融交易领域中的数据传输,以确保交易过程的安全性‌。

2. 电子商务‌:在在线交易中,AES算法用于保护敏感数据的传输,如信用卡信息、客户信息等,通过加密和解密确保数据的安全‌。

3. 政府通信‌:政府机构之间的通信,包括机密文件传输、电子邮件通信等,也常使用AES算法进行加密,以保护通信内容不被泄露‌。

4. 数据库加密‌:AES算法可用于数据库中敏感数据的加密和解密,以保护数据隐私和机密性,防止数据被非法访问‌1。

5. 移动应用安全‌:

  • 数据传输安全‌:在移动应用中,用户经常需要通过网络传输敏感数据,如个人信息、账户密码、交易记录等。AES算法能够对这些数据进行加密,确保在传输过程中不被窃取或篡改‌2。
  • 本地数据存储安全‌:移动设备上存储着大量用户数据,为了保护这些数据的安全,移动应用会使用AES算法对本地存储的数据进行加密‌。
  • 隐私保护‌:在移动社交、健康管理、金融理财等应用中,用户的隐私数据尤为重要。AES算法可用于加密这些隐私数据,确保只有用户本人或授权的应用才能访问‌2。

6. 网络通信安全‌:在互联网通信中,如SSL/TLS协议中,常使用AES加密算法来保护数据在网络传输过程中的机密性,防止数据被窃取或篡改‌。

7. 大规模数据加密‌:由于AES算法具有较高的加密速度,因此在大规模数据加密场景,如文件加密、网络数据加密等,AES算法是首选‌。

需要注意的是,虽然AES算法在多个领域都有广泛应用,但在选择加密算法时,还需根据具体的应用场景和安全需求进行综合考虑。例如,在某些需要同时保证数据机密性和完整性的场景,可能会结合使用AES算法和其他算法(如RSA算法用于密钥交换和数字签名)‌。

Java中AES加解密示例

在 Java 中使用 AES 加密,通常涉及到以下几个步骤:

  1. 生成密钥‌:AES 需要一个密钥来进行加密和解密操作。这个密钥可以是 128 位、192 位或 256 位长。密钥的长度越长,安全性越高,但加密和解密的速度可能会稍慢一些。

  2. 初始化向量(IV)‌:为了提高加密的安全性,通常在使用 AES 的 CBC(Cipher Block Chaining)模式时会用到一个初始化向量。IV 的长度应该与块大小相匹配(AES 的块大小是 128 位,即 16 字节)。

  3. 加密‌:使用密钥和可能的 IV 对数据进行加密。

以下是一个简单的 Java 示例,展示了如何使用 AES 进行加密和解密:

import java.security.SecureRandom;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;

public class AESExample {
    public static void main(String[] args) throws Exception {
        // 生成 AES 密钥
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 可以选择 128, 192, 或 256 位密钥
        SecretKey secretKey = keyGen.generateKey();

        // 生成初始化向量(IV)
        byte[] iv = new byte[16];
        SecureRandom random = new SecureRandom();
        random.nextBytes(iv);
        IvParameterSpec ivSpec = new IvParameterSpec(iv);

        // 初始化 Cipher 对象用于加密
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

        // 加密数据
        String input = "Hello, World!";
        byte[] encrypted = cipher.doFinal(input.getBytes());
        String encoded = Base64.getEncoder().encodeToString(encrypted);
        System.out.println("Encrypted: " + encoded);

        // 初始化 Cipher 对象用于解密
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);

        // 解密数据
        byte[] decoded = Base64.getDecoder().decode(encoded);
        byte[] decrypted = cipher.doFinal(decoded);
        System.out.println("Decrypted: " + new String(decrypted));
    }
}

在这个示例中,我们首先生成了一个 AES 密钥和一个初始化向量(IV)。然后,我们使用这个密钥和 IV 来加密一个字符串,并将加密后的结果转换为 Base64 编码的字符串以便于显示。接着,我们使用相同的密钥和 IV 来解密加密后的数据,恢复原始字符串。

总结

需要注意的是,在实际应用中,密钥和 IV 的管理非常重要。密钥应该安全存储,并且只有授权的用户或系统才能访问。IV 可以在加密时随机生成,并与加密后的数据一起存储或传输,因为它不需要保密。

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

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

相关文章

AI的使用:结构化提示词

根据自己的使用,不断的完善自己的提示词。并且像程序版本一样管理和迭代自己的提示词,这样才能准确的按照自己的目的去使用AI。而为了更好的管理,我们在一开始使用的时候,就要有一个易于管理的定义,即:结构…

Netcat:网络中的瑞士军刀

免责声明:使用本教程或工具,用户必须遵守所有适用的法律和法规,并且用户应自行承担所有风险和责任。 文章目录 一、引言二、简述三、Netcat功能?四、参数选项五、Netcat 的常见功能六、高级用法多连接处理创建简单的代理 七、Netc…

VS Code Copilot 与 Cursor 对比

选手简介 VS Code Copilot:算是“老牌”编程助手了,虽然Copilot在别的编辑器上也有扩展,不过体验最好的还是VS Code,毕竟都是微软家的所以功能集成更好一些;主要提供的是Complete和Chat能力,也就是代码补全…

28、基于springboot的房屋租赁系统

房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于Spring Boot的房屋租赁系统。 本文重点阐述了房屋租赁系统的开发过程&…

【Qt】显示类控件:QLabel、QLCDNumber、QProgressBar、QCalendarWidget

目录 QLabel QFrame 例子: textFormat pixmap、scaledContents alignment wordWrap、indent、margin buddy QLCDNumber 例子: QTimer QProgressBar 例子: QCalendarWidget 例子: QLabel 标签控件,用来显示…

基于STM32的自学习智能小车设计

目录 引言系统设计 硬件设计软件设计系统功能模块 传感器模块控制模块自学习算法模块系统实现 硬件实现软件实现测试与优化结论与展望 1. 引言 随着人工智能和机器学习技术的不断发展,越来越多的智能小车开始实现自主学习与行为决策。传统的智能小车通常依靠固定的…

Android OpenGLES2.0开发(九):图片滤镜

“当你改变想法的时候,记得也要改变你的世界。”——诺曼文森特皮尔 Android OpenGLES开发:EGL环境搭建Android OpenGLES2.0开发(一):艰难的开始Android OpenGLES2.0开发(二):环境搭…

梳理你的思路(从OOP到架构设计)_简介设计模式

目录 1、 模式(Pattern) 是较大的结构​编辑 2、 结构形式愈大 通用性愈小​编辑 3、 从EIT造形 组合出设计模式 1、 模式(Pattern) 是较大的结构 组合与创新 達芬奇說:簡單是複雜的終極形式 (Simplicity is the ultimate form of sophistication) —Leonardo d…

vscode的keil assistant 中搜索不到全局变量

搜不到 但是在包含的文件中输入 ../../../,就是全局搜索的结果 我的文件结构是:\Desktop\LVGL文件系统移植(lvgl8.3)\Projects\MDK-ARM 盲猜是keil assistant 当前文件夹打开的时候是进入到了MDK-ARM文件夹层次&…

HTML语法规范

HTML语法规则 HTML 标签是由尖括号包围的关键词&#xff0c;标签通常是成对出现的&#xff0c;例如 <html> 和 </html>&#xff0c;称为双标签 。标签对中的第一个标签是开始标签&#xff0c;第二个标签是结束标签单标签比较少&#xff0c;例如<br />&#x…

flink实现复杂kafka数据读取

接上文&#xff1a;一文说清flink从编码到部署上线 环境说明&#xff1a;MySQL&#xff1a;5.7&#xff1b;flink&#xff1a;1.14.0&#xff1b;hadoop&#xff1a;3.0.0&#xff1b;操作系统&#xff1a;CentOS 7.6&#xff1b;JDK&#xff1a;1.8.0_401。 常见的文章中&…

大模型微调---Prompt-tuning微调

目录 一、前言二、Prompt-tuning实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、Prompt-tuning微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 Prompt-tuning通过修改输入文本的提示&#xff08;Prompt&#xff09;来引导模型生…

如何使用 WebAssembly 扩展后端应用

1. WebAssembly 简介 随着互联网的发展&#xff0c;越来越多的应用借助 Javascript 转到了 Web 端&#xff0c;但人们也发现&#xff0c;随着移动互联网的兴起&#xff0c;需要把大量的应用迁移到手机端&#xff0c;随着手端的应用逻辑越来越复杂&#xff0c;Javascript 的解析…

python学习——洛谷P2010 [NOIP2016 普及组] 回文日期 三种方法

[NOIP2016 普及组] 回文日期 文章目录 [NOIP2016 普及组] 回文日期题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示方法一方法二方法三 题目背景 NOIP2016 普及组 T2 题目描述 在日常生活中&#xff0c;通过年、月、日这…

前端yarn工具打包时网络连接问题排查与解决

最近线上前端打包时提示 “There appears to be trouble with your network connection”&#xff0c;以此文档记录下排查过程。 前端打包方式 docker启动临时容器打包&#xff0c;命令如下 docker run --rm -w /app -v pwd:/app alpine-node-common:v16.20-pro sh -c "…

BenchmarkSQL使用教程

1. TPC-C介绍 Transaction Processing Performance Council (TPC) 事务处理性能委员会&#xff0c;是一家非盈利IT组织&#xff0c;他们的目的是定义数据库基准并且向产业界推广可验证的数据库性能测试。而TPC-C最后一个C代表的是压测模型的版本&#xff0c;在这之前还有TPC-A、…

Linux网络基础--传输层Tcp协议(上) (详细版)

目录 Tcp协议报头&#xff1a; 4位首部长度&#xff1a; 源端口号和目的端口号 32位序号和确认序号 标记位 超时重传机制&#xff1a; 两个问题 连接管理机制 三次握手&#xff0c;四次挥手 建立连接&#xff0c;为什么要有三次握手&#xff1f; 先科普一个概念&…

全志H618 Android12修改doucmentsui鼠标单击图片、文件夹选中区域

背景: 由于当前的文件管理器在我们的产品定义当中,某些界面有改动的需求,所以需要在Android12 rom中进行定制以符合当前产品定义。 需求: 在进入File文件管理器后,鼠标左击整个图片、整个文件夹可以选中该类型,进行操作,故代码分析以及客制化如下: 主要涉及的代码:…

Unity命令行传递自定义参数 命令行打包

命令行参数增加位置 -executeMethod 某脚本.某方法 参数1 参数2 参数3 ... 例如执行EditorTest.GetCommandLineArgs方法 增加两个命令行参数 Version=125 CDNVersion=100 -executeMethod EditorTest.GetCommandLineArgs Version=125 CDNVersion=100 Unity测试脚本 需要放在…

如何重新设置VSCode的密钥环密码?

故障现象&#xff1a; 忘记了Vscode的这个密码&#xff1a; Enter password to unlock An application wants access to the keyring “Default ke... Password: The unlock password was incorrect Cancel Unlock 解决办法&#xff1a; 1.任意terminal下&#xff0c;输入如下…