AES加解密算法:原理、应用与安全性解析

文摘   2024-09-14 19:33   广东  

AES,全称Advanced Encryption Standard,即高级加密标准,是由美国国家标准与技术研究院(NIST)在2001年发布的。它旨在取代早期的数据加密标准(DES),并提供更高的安全性。AES算法是一种对称加密算法,即加密和解密使用相同的密钥。

一、AES算法的工作原理

AES支持多种密钥长度,最常见的是128位、192位和256位。密钥长度越长,加密强度越高,相应地,计算资源消耗也会增加。

AES算法通过多轮次的置换-置换网络(SPN)结构来实现加密过程。每轮操作包括字节替换(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)和添加轮密钥(AddRoundKey)四个步骤。这些步骤的组合使得AES算法能够有效地混淆和扩散输入数据,从而生成难以破解的密文。

解密过程是加密过程的逆操作,通过相反的顺序执行逆字节替换(InvSubBytes)、逆行移位(InvShiftRows)、逆列混合(InvMixColumns)和添加轮密钥(AddRoundKey)等步骤来还原原始数据。

1.1 密钥扩展

AES算法的第一步是密钥扩展。在这一步中,算法将输入的密钥(可以是128位、192位或256位)扩展成多个轮密钥。这些轮密钥将在后续的加密轮次中使用。密钥扩展过程确保了每轮加密都使用不同的密钥,从而增强了算法的安全性。

1.2 加密过程

AES的加密过程包括多个轮次的处理,每个轮次都包含以下四个步骤:

「字节替换(SubBytes)」在这一步中,算法使用一个称为S盒(Substitution box)的固定置换表来替换输入数据的每个字节。S盒是一个非线性置换,它增加了数据的混淆程度,使得加密过程更加难以预测。
  1. 「行移位(ShiftRows)」:行移位操作将数据块中的每一行进行循环左移。不同行的移动距离不同,这有助于在加密过程中进一步扩散数据。
  2. 「列混合(MixColumns)」(除最后一轮外):在这一步中,算法使用一个固定的矩阵与数据块的每一列进行矩阵乘法运算。这个操作进一步混淆了数据,并增强了加密过程的非线性性。然而,在最后一轮加密中省略了这一步,以简化解密过程。
  3. 「轮密钥加(AddRoundKey)」:在这一步中,算法将当前轮次的轮密钥与数据块进行异或运算。这个操作将密钥信息融入到加密过程中,确保了每轮加密都使用不同的密钥。

经过多轮处理后,算法输出加密后的密文数据。

1.3 解密过程

AES的解密过程是加密过程的逆操作。它首先使用与加密过程相同的密钥扩展算法生成轮密钥。然后,从最后一轮开始逆向执行解密操作,包括逆行移位、逆字节替换、逆列混合(除第一轮外)和轮密钥加等步骤。最终,解密过程输出原始的明文数据。

二、AES的用法

Java标准库中的javax.crypto包提供了完整的加密框架和API,支持包括AES在内的多种加密算法:

import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.security.NoSuchAlgorithmException;import java.util.Base64;
public class AESExample {
// AES 密钥长度(128位、192位、256位),这里使用128位 private static final int AES_KEY_SIZE = 128;
// 加密方法 public static String encrypt(String plainText, String secretKey) throws Exception { // 将密钥转换为AES密钥规范 SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");
// 创建Cipher实例,并初始化为加密模式 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec);
// 对明文进行加密 byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
// 将加密后的字节数组转换为Base64编码的字符串 return Base64.getEncoder().encodeToString(encryptedBytes); }
// 解密方法 public static String decrypt(String encryptedText, String secretKey) throws Exception { // 将密钥转换为AES密钥规范 SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");
// 创建Cipher实例,并初始化为解密模式 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, keySpec);
// 将Base64编码的加密字符串转换为字节数组 byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
// 对加密的字节数组进行解密 byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
// 将解密后的字节数组转换为字符串 return new String(decryptedBytes, StandardCharsets.UTF_8); }
// 生成AES密钥 public static String generateAESKey() throws NoSuchAlgorithmException { // 创建AES密钥生成器 KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(AES_KEY_SIZE);
// 生成AES密钥 SecretKey secretKey = keyGenerator.generateKey();
// 将密钥转换为Base64编码的字符串 return Base64.getEncoder().encodeToString(secretKey.getEncoded()); }
public static void main(String[] args) { try { // 生成AES密钥 String secretKey = generateAESKey(); System.out.println("生成的AES密钥:" + secretKey);
String plainText = "这是一个需要加密的明文"; System.out.println("原始明文:" + plainText);
String encryptedText = encrypt(plainText, secretKey); System.out.println("加密后的文本:" + encryptedText);
String decryptedText = decrypt(encryptedText, secretKey); System.out.println("解密后的明文:" + decryptedText); } catch (Exception e) { e.printStackTrace(); } }}

「注意」代码使用ECB模式,但ECB模式通常不推荐用于加密,因为它不提供足够的安全性。建议使用更安全的模式,如CBC或GCM。



太强 ! SpringBoot中优化if-else语句的七种绝佳方法实战

太强 ! SpringBoot中出入参增强的5种方法 : 加解密、脱敏、格式转换、时间时区处理

flowable、activiti、camunda 三大工作流引擎技术选型指南

微服务中token鉴权设计的4种方式总结

90分掌握一门语言:lua脚本基础到高级教程

提升编程效率的利器: Google Guava库中双向映射BitMap

从MySQL行格式原理看:为什么开发规范中不推荐NULL?数据是如何在磁盘上存储的?

Java并发库(JUC)中LongAdder:高并发下基于分段锁和CAS的操作优化

提升编程效率的利器: Google Guava库之RateLimiter优雅限流

玩转同步控制:LockSupport深入解读

必知必会!MySQL索引下推:原理与实战

MySQL 索引优化:深入自适应哈希索引的奥秘

从MySQL行格式原理看:为什么开发规范中不推荐NULL?数据是如何在磁盘上存储的?

结合MySQL成本模型的查询性能优化实战

关注『 码到三十五 』,日有所获

   点赞+转发+在看 就是最大的支持

码到三十五
主要分享正经的开发技术(原理,架构,实践,源码等),以输出驱动输入;当然偶尔会穿插点生活琐碎,顺便吃个瓜,目的嘛,搞点精准流量,看能不能发发广告。
 最新文章