对称加密:AES使用介绍

AES(Advanced Encryption Standard,高级加密标准) 是一种对称加密算法,用于加密数据,并广泛应用于现代加密领域。它由美国国家标准与技术研究院(NIST)于 2001 年发布,成为目前最常用的对称加密算法之一。AES 设计的目标是替代旧有的加密标准 DES(Data Encryption Standard),并具备更高的安全性和更高的效率。

1. AES 概述

AES 是一种 对称密钥加密算法,即加密和解密过程使用相同的密钥。AES 支持三种不同的密钥长度:128 位、192 位和 256 位,分别称为 AES-128、AES-192 和 AES-256。

  • 加密过程:将明文分成固定大小的块(通常为 16 字节),然后用密钥和若干轮的数学运算(包括替代、置换、混合、分组等操作)将其转换成密文。
  • 解密过程:使用相同的密钥对密文进行逆运算,将其恢复为明文。

AES 基于 分组加密(block cipher),它将输入的数据(明文)分成固定大小的块,常见的块大小为 128 位(16 字节)

2. AES 工作原理

AES 的核心操作是由一系列的 轮次(Rounds) 构成。每一轮都包括以下四种主要操作:

  1. SubBytes(字节替代): 使用一个固定的字节替换表(S-box)将每个字节替换为一个新的字节。
  2. ShiftRows(行移位): 将状态数组的每一行向左循环移位,移位的数量取决于行的位置。
  3. MixColumns(列混合): 对每一列进行线性变换,混合每列的字节。它使得每个字节的变化不仅仅依赖于它自己,而是依赖于列中的所有字节。
  4. AddRoundKey(轮密钥加): 将当前状态与一个由密钥生成的轮密钥进行异或运算。这个操作确保每一轮都与密钥相关联。

这些操作会根据所使用的密钥长度(AES-128、AES-192、AES-256)重复一定次数(轮次):

  • AES-128:共 10 轮
  • AES-192:共 12 轮
  • AES-256:共 14 轮

3. AES 密钥扩展

AES 使用的密钥长度决定了密钥扩展的过程。密钥扩展生成一系列的 轮密钥(Round Key),每一轮的加密操作都使用不同的轮密钥。

  • AES-128:将 128 位的密钥扩展为 44 个 32 位的词(即 176 字节)。
  • AES-192:将 192 位的密钥扩展为 52 个 32 位的词(即 208 字节)。
  • AES-256:将 256 位的密钥扩展为 60 个 32 位的词(即 240 字节)。

这些扩展的轮密钥将与明文和中间状态进行异或操作,确保每一轮的加密与密钥相关。

4. AES 模式

AES 支持多种加密模式,每种模式在使用 AES 加密时有不同的操作方式和安全特性。常见的 AES 模式包括:

  1. ECB(Electronic Codebook)模式: 每个明文块单独加密,不会受到其他块的影响。虽然简单但不够安全,因为相同的明文块会被加密为相同的密文块,容易受到模式分析攻击。
  2. CBC(Cipher Block Chaining)模式: 每个明文块在加密前与前一个密文块进行异或操作。这样,两个相同的明文块加密后会得到不同的密文,从而提高了安全性。CBC 模式需要初始化向量(IV)来保证加密的随机性。
  3. CFB(Cipher Feedback)模式: 类似于 CBC 模式,但它将前一个密文块的一部分作为输入,适合加密任意长度的数据流。
  4. OFB(Output Feedback)模式: 使用前一个加密块的输出作为输入来加密当前块,确保每次加密操作不依赖于前一个密文块,避免错误扩散。
  5. CTR(Counter)模式: 使用计数器来生成每个加密块的密钥流,计数器是递增的,能并行加密数据块,因此加密速度较快。
  6. GCM(Galois/Counter Mode)模式: 结合了加密和认证功能,适用于需要加密并保证数据完整性的场景。它提供了数据的机密性和完整性保证(同时进行加密和认证)。

5. AES 示例代码

例子 1:使用 CBC 模式加密和解密数据(PyCryptodome)

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64

# 生成 128 位的随机密钥
key = get_random_bytes(16)

# 随机生成初始化向量(IV)
iv = get_random_bytes(16)

# 初始化 AES 加密器,使用 CBC 模式
cipher = AES.new(key, AES.MODE_CBC, iv)

# 要加密的数据
data = "This is a secret message".encode('utf-8')

# 填充数据,使其长度为 16 的倍数
pad_length = 16 - (len(data) % 16)
data += bytes([pad_length]) * pad_length

# 加密
encrypted_data = cipher.encrypt(data)

# 输出加密后的数据(Base64 编码)
print("Encrypted:", base64.b64encode(encrypted_data).decode())

# 解密
cipher_dec = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = cipher_dec.decrypt(encrypted_data)

# 去除填充
decrypted_data = decrypted_data[:-decrypted_data[-1]].decode('utf-8')

print("Decrypted:", decrypted_data)

例子 2:使用 ECB 模式加密和解密数据(PyCryptodome)

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64

# 生成 128 位的随机密钥
key = get_random_bytes(16)

# 初始化 AES 加密器,使用 ECB 模式
cipher = AES.new(key, AES.MODE_ECB)

# 要加密的数据
data = "This is a secret message".encode('utf-8')

# 填充数据,使其长度为 16 的倍数
pad_length = 16 - (len(data) % 16)
data += bytes([pad_length]) * pad_length

# 加密
encrypted_data = cipher.encrypt(data)

# 输出加密后的数据(Base64 编码)
print("Encrypted:", base64.b64encode(encrypted_data).decode())

# 解密
cipher_dec = AES.new(key, AES.MODE_ECB)
decrypted_data = cipher_dec.decrypt(encrypted_data)

# 去除填充
decrypted_data = decrypted_data[:-decrypted_data[-1]].decode('utf-8')

print("Decrypted:", decrypted_data)

6. AES 安全性分析

  • 密钥长度:AES 的安全性直接与密钥长度相关。AES-128 仍然被认为是非常安全的,但 AES-256 提供了更高的安全性,特别是对于要求极高安全性的应用(例如,政府、金融等)。
  • 模式的选择:在 AES 中,使用 ECB 模式 时,数据的相同部分会被加密成相同的密文块,这使得 ECB 模式不适合处理高度敏感的数据。相反,CBC 模式 和 GCM 模式 提供更高的安全性,特别是在加密多个块时,能够防止相同明文产生相同密文。
  • 性能:AES 具有很高的性能,特别是在硬件加速支持的情况下,AES 加密速度较快,因此适用于需要大规模加密的数据传输和存储。

总结

  • AES 是一个强大的对称加密算法,广泛应用于数据加密、传输加密等领域。
  • 它支持 多种密钥长度(128、192、256),并提供多种加密模式(如 CBC、GCM、CTR 等),使得它可以灵活适应不同的应用场景。
  • 选择合适的加密模式 对安全性至关重要,而 CBC 和 GCM 是常用的加密模式,提供了较强的安全性。


文章标签:

评论(0)