Python中的AES算法

2025年1月5日 | 阅读6分钟

高级加密标准 (AES) 是一种众所周知的对称加密方法,通过将数据转换为不可读的格式来保护数据安全。只有通过解密密钥反向操作才能读取。它有许多用途,包括在数据静止时保护数据以及在公共网络(如互联网)上加密数据传输。它是计算机网络和安全中最安全的算法之一。

AES Algorithm in Python

它支持 128、192 和 256 位的密钥长度,并采用多轮替换-置换网络结构。AES 对暴力攻击具有高度抵抗力,并广泛用于保护静止和传输中的数据,例如在 HTTPS 和全盘加密中。其效率和强大的安全性使其成为现代加密需求的顶级选择。

DES 诞生于 20 世纪 70 年代,密钥长度固定为 56 位,容易受到现代计算攻击。随着 DES 越来越容易受到密码攻击,其用于安全数据加密的用途逐渐减少。作为自 2001 年以来的 NIST 标准,AES 提供了多种密钥长度(128、192 和 256 位)和更可靠的算法框架。AES 凭借其更大的密钥长度和替换-置换网络(SPN)结构,提供了更高级别的安全性,使其能够抵抗已知的攻击,并非常适合现代安全需求。此后,AES 已成为首选加密技术,在大多数情况下有效地取代了 DES。

AES(高级加密标准)因其在现代密码学中的效率而广受认可。其优势在于提供强大的安全性的同时保持出色的计算性能。AES 在固定大小的 128 位块上运行,可以在现代计算机架构中进行高效处理并促进硬件加速。该算法在固定轮数中采用了替换、置换和混合操作的良好平衡组合。

AES 算法的特性

  1. 对称加密:AES 使用相同的密钥进行加密和解密,使其成为对称加密技术。这个密钥被称为“AES 密钥”。
  2. AES 提供 128 位、192 位或 256 位的密钥。加密的强度受密钥大小选择的影响。更长的密钥提供更高的安全性,但会增加处理能力。
  3. 分组密码:AES 在固定大小的数据块上运行。
  4. 轮数:根据密钥大小,AES 使用定义的轮数进行加密和解密。对于 AES-128 使用 10 轮,对于 AES-192 使用 12 轮,对于 AES-256 使用 14 轮。
  5. 替换-置换网络(SPN):AES 使用 SPN 结构。在每一轮中,数据以多种方式进行更改,例如替换(将一个字节替换为另一个字节)和置换(重新排列字节)。
  6. 密钥扩展:AES 密钥经过密钥扩展过程以生成轮密钥。这些轮密钥用于加密和解密的每一轮。密钥扩展过程涉及混合、轮换和替换密钥字节。
  7. 安全性:根据专家称,AES 可抵抗多种攻击,包括暴力攻击。在 AES 加密中,长密钥比短密钥提供更高的安全性。
  8. 性能:AES 被设计成能在现代 CPU 上快速有效地运行,适合各种应用。
  9. 工作模式:AES 可用于多种模式,包括电子密码本(ECB)、密码块链(CBC)、计数器(CTR)等。
  10. 应用:AES 在不同领域有多种应用。它用于保护软件应用程序中的数据,以确保用户的机密性和数据完整性。这包括传输中的数据(如 HTTPS)以及静止中的数据。

AES 加密过程的高级工作原理

  • 数据被分成 128 位块。
  • 从 AES 密钥派生出初始轮密钥。
  • 对每个块执行多轮替换、置换和混合(基于 AES 密钥)。
  • 最后一轮产生加密数据,可以安全地传输或存储。
  • 解密通过使用相同的 AES 密钥和轮密钥来恢复原始数据来逆转该过程。

AES 算法

  1. 密钥扩展
    • 原始加密密钥被扩展成一组轮密钥。
    • 密钥扩展过程涉及对原始密钥应用各种变换,以创建用于加密和解密过程的密钥调度。
  2. 初始轮(AddRoundKey)
    • 明文块与第一个轮密钥进行 XOR(按位异或)运算。
  3. 主轮(SubBytes, ShiftRows, MixColumns, AddRoundKey)
    • 根据密钥大小(10、12 或 14),这些轮会重复执行指定的轮数。
    • SubBytes:状态(明文或中间结果)的每个字节都用 AES S-Box 中的相应字节替换,S-Box 是一个固定的 8 位替换表。
    • ShiftRows:状态的行进行循环移位,第一行不变,第二行向左移位一位,第三行向左移位两位,第四行向左移位三位。
    • MixColumns:此步骤涉及对状态的列进行矩阵乘法运算。它实现了数据在状态字节之间的扩散。
    • AddRoundKey:状态与当前轮的轮密钥进行 XOR 运算。
  4. 最终轮(SubBytes, ShiftRows, AddRoundKey)
    • 最后一轮与主轮类似,但省略了 MixColumns 步骤。
  5. 输出
    • 最后一轮后的最终状态即为密文。

Python 代码

输出

Plaintext:  b'This is a secret message'
Ciphertext:  b'\x95\xc5\xabI]\xc0\x9b]\x0b\xb3\xf0\x15o\xea\xac\x9d'
Decrypted Text:  b'This is a secret message\x00\x00\x00\x00\x00\x00\x00\x00'

解释

  1. 此示例为了简单起见,在 ECB(电子密码本)模式下使用了 AES。ECB 模式不建议用于大多数用例,因为它不提供语义安全,并且相同的明文块将产生相同的密文块。在实践中,您应该使用更安全的模式,如 CBC 或 GCM。
  2. 密钥应保持机密,切勿在代码中硬编码。
  3. 此处使用 get_random_bytes 函数生成随机密钥。在实践中,您应该安全地管理您的加密密钥。
  4. 请确保在生产实现中处理异常和错误检查。

AES 的应用

  1. 数据加密:AES 是在存储和传输过程中保护敏感数据的基础。它用于保护机密文件、通信以及数据库中静止的数据,确保隐私和机密性。
  2. 安全通信:AES 用于保护网络上的数据传输,包括用于安全网页浏览的 HTTPS、用于远程访问的 VPN 以及加密电子邮件通信。
  3. 金融交易:AES 确保在线银行、电子商务和移动支付系统中的金融交易安全,防止欺诈和数据泄露。

AES 的局限性

  1. 密钥管理:AES 的安全性在很大程度上取决于加密密钥的强度。管理和保护加密密钥至关重要。如果密钥泄露,AES 加密的安全性也会受到损害。
  2. 块大小:AES 在固定大小的数据块(128 位或 16 字节)上运行。当加密大文件时,这可能会导致问题,因为每个块必须单独加密。通常使用像密码块链(CBC)这样的模式来解决这个问题,但它们会引入复杂性。
  3. 填充:当明文的长度不是块大小的整数倍时,AES 加密可能需要填充。填充可能会泄露有关明文长度的信息。
  4. 无内置身份验证:AES 提供机密性,但本身不提供数据完整性或身份验证。为此需要额外的加密技术,如 HMAC 或数字签名。
  5. 侧信道攻击:AES 实现可能容易受到侧信道攻击,在这种攻击中,攻击者即使密钥保持秘密,也能通过物理或时间测量获得有关加密过程的信息。
  6. 资源密集:AES 加密和解密可能在计算上很密集,尤其是在使用 256 位等较大的密钥大小时。这在资源受限的环境中可能是一个限制。
  7. 量子计算威胁:虽然 AES 被认为对经典计算机来说是安全的,但量子计算的出现可能会威胁到其安全性,特别是对于较小的密钥大小。
  8. 已知明文攻击:当攻击者能够访问明文和密文对时,AES 容易受到已知明文攻击。这可能会暴露关于密钥的信息。