AES 算法详解 – wiki基地


AES 算法详解:现代对称加密的基石

引言

在信息时代,数据的安全传输与存储至关重要。无论是网上银行交易、电子邮件通信,还是存储在硬盘上的敏感文件,我们都依赖于强大的加密技术来保护信息不被未经授权的访问者获取。在众多加密算法中,高级加密标准(Advanced Encryption Standard,简称 AES)无疑是应用最广泛、最受信任的对称加密算法之一。它凭借其出色的安全性、高效的性能以及灵活的设计,已成为全球范围内保护敏感数据的行业标准。本文将深入探讨 AES 算法的方方面面,从其历史背景、设计原理、核心操作步骤,到密钥扩展、解密过程、安全特性以及实际应用,为您呈现一幅详尽的 AES 画卷。

AES 的诞生背景与历史

AES 的故事始于 20 世纪末。当时,广泛使用的 数据加密标准(Data Encryption Standard,DES)面临着日益严峻的安全挑战。DES 使用 56 位的密钥,随着计算能力的飞速发展,通过暴力破解(Brute-force Attack)来尝试所有可能的密钥组合变得越来越可行。此外,DES 还存在一些理论上的弱点,如易受差分密码分析(Differential Cryptanalysis)和线性密码分析(Linear Cryptanalysis)的影响。

为了取代日渐老化的 DES,美国国家标准与技术研究院(NIST)于 1997 年发起了一项公开征集活动,旨在遴选一种新的、更强大的对称加密算法,作为下一代联邦信息处理标准(FIPS)。该过程要求新算法必须:

  1. 是对称分组密码算法: 使用相同的密钥进行加密和解密,并且以固定大小的数据块进行操作。
  2. 支持多种密钥长度: 至少支持 128 位、192 位和 256 位的密钥长度。
  3. 设计公开且可评估: 算法的设计细节必须完全公开,以便全球密码学界进行广泛的分析和评估。
  4. 安全可靠: 对已知的所有密码分析攻击(如暴力破解、差分分析、线性分析等)具有高强度抵抗能力。
  5. 高效灵活: 能够在各种硬件(如高性能服务器、智能卡、嵌入式设备)和软件平台上高效实现,内存占用小,执行速度快。
  6. 免版税全球使用: 算法必须是免费且无专利限制的,以便在全球范围内推广和应用。

这场竞赛吸引了来自世界各地的 15 个候选算法。经过长达三年的多轮严格评估、公开讨论和密码分析,NIST 于 2000 年 10 月宣布,由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计的 Rijndael 算法最终胜出。2001 年 11 月 26 日,Rijndael 被正式采纳为 FIPS PUB 197,并命名为高级加密标准(AES)。

Rijndael 之所以能够脱颖而出,主要得益于其简洁优雅的设计、卓越的安全性能、出色的运算效率以及对不同平台的高度适应性。它不仅满足了 NIST 的所有要求,还在安全性、性能和灵活性之间取得了极佳的平衡。

AES 算法核心概念

在深入了解 AES 的具体操作步骤之前,我们需要掌握一些核心概念:

  1. 对称分组密码: AES 是一种对称密码算法,意味着加密和解密使用相同的密钥。它也是一种分组密码,将明文数据分割成固定大小的块(Block)进行处理。
  2. 块大小(Block Size): AES 标准规定其块大小固定为 128 位(16 字节)。无论明文多长,都会被填充(Padding)并分割成若干个 16 字节的块进行加密。
  3. 密钥长度(Key Length): AES 支持三种不同的密钥长度:
    • AES-128: 128 位(16 字节)密钥,加密进行 10 轮(Round)操作。
    • AES-192: 192 位(24 字节)密钥,加密进行 12 轮操作。
    • AES-256: 256 位(32 字节)密钥,加密进行 14 轮操作。
      密钥长度越长,理论上的安全性越高(抗暴力破解能力更强),但计算开销也略有增加。
  4. 状态(State): AES 在处理数据时,会将每个 128 位的输入块(明文块或中间处理块)表示为一个 4×4 的字节矩阵,称为“状态(State)”。这个矩阵按列优先(Column-major Order)填充,即输入块的前 4 个字节构成第一列,接下来 4 个字节构成第二列,依此类推。
    State = | s0,0 s0,1 s0,2 s0,3 |
    | s1,0 s1,1 s1,2 s1,3 |
    | s2,0 s2,1 s2,2 s2,3 |
    | s3,0 s3,1 s3,2 s3,3 |

    其中 s(r,c) 代表位于第 r 行、第 c 列的字节。AES 的所有内部操作都是在这个状态矩阵上进行的。
  5. 轮(Round): AES 加密过程不是一步完成的,而是通过多次迭代执行一系列固定的数学运算来完成,每一次迭代称为一“轮”。轮数取决于密钥长度(10、12 或 14 轮)。每一轮都包含若干个不同的变换步骤,旨在混淆(Confusion)和扩散(Diffusion)数据,使得密文与明文、密钥之间的关系变得极其复杂。
  6. 轮密钥(Round Key): 原始的加密密钥(128、192 或 256 位)并不能直接用于每一轮的加密操作。需要通过一个称为“密钥扩展(Key Expansion)”或“密钥调度(Key Schedule)”的算法,从原始密钥生成一系列的轮密钥。每个轮密钥也是 128 位(16 字节),与状态矩阵大小相同。每一轮加密都会使用一个不同的轮密钥。

AES 加密过程详解

AES 的加密过程可以概括为以下几个主要阶段:

  1. 密钥扩展(Key Expansion): 使用密钥调度算法,从初始的密码密钥(Cipher Key)生成加密所需的全部轮密钥。总共需要生成 Nr + 1 个轮密钥,其中 Nr 是加密的轮数(10、12 或 14)。
  2. 初始轮密钥加(Initial AddRoundKey): 将第一个轮密钥(Round Key 0)与初始的明文块(表示为状态矩阵)进行按位异或(XOR)操作。这是加密过程的第一步,也是唯一在主循环之外的 AddRoundKey 操作。
  3. 主循环(Rounds): 执行 Nr 轮标准的加密操作。对于 AES-128/192/256,分别执行 10/12/14 轮。每一轮(除了最后一轮)都包含以下四个步骤,按顺序执行:
    • 字节替换(SubBytes): 对状态矩阵中的每个字节,使用一个预定义的替换表(S-box)进行非线性替换。
    • 行移位(ShiftRows): 将状态矩阵的每一行进行循环左移。移动的位数取决于行号(第 0 行不移动,第 1 行左移 1 字节,第 2 行左移 2 字节,第 3 行左移 3 字节)。
    • 列混合(MixColumns): 对状态矩阵的每一列进行线性变换。将每列视为伽罗瓦域 GF(2^8) 上的四项式,并与一个固定的矩阵进行乘法运算。这是一个重要的扩散操作。
    • 轮密钥加(AddRoundKey): 将当前状态矩阵与当前轮的轮密钥进行按位异或操作。
  4. 最终轮(Final Round): 最后一轮的操作与标准轮略有不同,它包含:
    • 字节替换(SubBytes)
    • 行移位(ShiftRows)
    • 轮密钥加(AddRoundKey)
      注意: 最后一轮没有 MixColumns 步骤。省略 MixColumns 使得加密和解密过程在结构上更对称。

经过以上所有步骤后,最终的状态矩阵即为加密后的密文块。

下面我们详细解析每一轮中的四个核心变换操作:

1. 字节替换(SubBytes)

SubBytes 是 AES 中唯一的非线性变换步骤,也是其抵抗线性分析和差分分析的关键。它独立地作用于状态矩阵中的每一个字节。

  • 操作: 对于状态矩阵中的每个字节 s(r,c),将其值作为索引,在一个固定的 8 位替换表(称为 S-box,Substitution Box)中查找对应的替换值,并用该替换值更新 s(r,c)
  • S-box 的构造: AES 的 S-box 并非随机生成,而是通过严谨的数学构造得出的。它包含两个步骤:
    1. 求逆元: 将输入字节视为伽罗瓦域 GF(2^8) 中的元素(使用特定的不可约多项式 m(x) = x^8 + x^4 + x^3 + x + 1),计算其乘法逆元(0 的逆元定义为 0)。
    2. 仿射变换: 对上一步得到的逆元字节,再进行一个固定的仿射变换(Affine Transformation)。即乘以一个特定的 8×8 二进制矩阵,再加上一个固定的 8 位常量向量(0x6301100011)。
  • 目的: S-box 的设计旨在提供优异的非线性特性,破坏输入和输出之间的任何简单代数关系,从而实现混淆(Confusion),使得密码分析者难以通过分析输入输出差异来推断密钥信息。

2. 行移位(ShiftRows)

ShiftRows 是一个简单的置换操作,旨在提供行间的扩散(Diffusion)。

  • 操作: 对状态矩阵的后三行进行循环左移操作:
    • 第 0 行(顶行)保持不变。
    • 第 1 行循环左移 1 个字节位置。
    • 第 2 行循环左移 2 个字节位置。
    • 第 3 行(底行)循环左移 3 个字节位置。
      Input State Output State after ShiftRows
      s00 s01 s02 s03 s00 s01 s02 s03
      s10 s11 s12 s13 -> s11 s12 s13 s10
      s20 s21 s22 s23 s22 s23 s20 s21
      s30 s31 s32 s33 s33 s30 s31 s32
  • 目的: ShiftRows 将来自不同列的字节移动到同一列中,确保在下一轮的 MixColumns 操作中,每一列的输出都依赖于上一轮状态矩阵中多个列的输入。这增强了算法的扩散性,使得明文或密钥的微小改变能够迅速影响到整个密文块。

3. 列混合(MixColumns)

MixColumns 是一个重要的线性混合变换,它独立地作用于状态矩阵的每一列,提供列内的扩散。

  • 操作: 将状态矩阵的每一列视为 GF(2^8) 上的一个四项式。然后,将这个列向量与一个固定的 4×4 矩阵在 GF(2^8) 上进行乘法运算。GF(2^8) 上的加法是按位异或(XOR),乘法是多项式乘法模一个不可约多项式(同 S-box 构造中使用的 m(x))。
    固定的乘法矩阵为:
    | 02 03 01 01 |
    | 01 02 03 01 |
    | 01 01 02 03 |
    | 03 01 01 02 |

    对于状态矩阵的某一列 [s0, s1, s2, s3]^T,经过 MixColumns 变换后的新列 [s'0, s'1, s'2, s'3]^T 计算如下(其中 . 表示 GF(2^8) 乘法,+ 表示 XOR):
    s'0 = (02 . s0) + (03 . s1) + (01 . s2) + (01 . s3)
    s'1 = (01 . s0) + (02 . s1) + (03 . s2) + (01 . s3)
    s'2 = (01 . s0) + (01 . s1) + (02 . s2) + (03 . s3)
    s'3 = (03 . s0) + (01 . s1) + (01 . s2) + (02 . s3)

    GF(2^8) 中的乘法 01 . x = x02 . x 是将 x 左移一位,如果最高位是 1 则再异或 0x1B(对应 m(x) 的最低 8 位),03 . x = (02 . x) + x
  • 目的: MixColumns 确保了状态矩阵每一列中的 4 个字节之间发生相互作用。结合 ShiftRows 的行间扩散,这两步共同保证了经过几轮操作后,状态矩阵中的每一个字节都受到明文块和密钥所有字节的影响,实现了高度的扩散性。
  • 注意: 如前所述,MixColumns 步骤在加密的最后一轮被省略。

4. 轮密钥加(AddRoundKey)

AddRoundKey 是将密钥材料引入加密过程的关键步骤。

  • 操作: 将当前状态矩阵与当前轮对应的轮密钥(也是一个 4×4 的字节矩阵)进行简单的按位异或(XOR)操作。状态矩阵中的每个字节 s(r,c) 与轮密钥中对应位置的字节 k(r,c) 进行 XOR 运算,结果更新 s(r,c)
    State = State XOR RoundKey
  • 目的: 这是 AES 中唯一直接使用密钥(轮密钥)的操作。它将密钥的影响混入到状态数据中。由于 XOR 操作是线性的,且其自身是其逆运算,这使得 AddRoundKey 在加密和解密中都易于实现和撤销。SubBytes 的非线性确保了仅靠 AddRoundKey 的线性操作不足以破解算法。

AES 密钥扩展(Key Expansion / Key Schedule)

AES 的安全性不仅依赖于轮函数的强度,也高度依赖于密钥扩展算法的质量。密钥扩展算法负责从用户提供的初始密钥(128、192 或 256 位)生成共 Nr + 1 个 128 位的轮密钥(表示为 W[0]W[4*Nr + 3],其中每个 W[i] 是一个 32 位字/Word)。

密钥扩展过程是迭代进行的,其核心思想是:每个新的轮密钥字(Word)都依赖于前面的字。过程大致如下:

  1. 初始化: 将初始的密码密钥(Cipher Key)按顺序复制到扩展密钥数组 W 的最前面。例如,对于 AES-128,初始密钥构成 W[0]W[3]
  2. 迭代生成: 对于后续的字 W[i]i >= Nk,其中 Nk 是密钥长度对应的字数,Nk=4 for 128-bit, 6 for 192-bit, 8 for 256-bit),其生成规则如下:
    • 对于 iNk 的倍数的情况:
      W[i] = W[i-Nk] XOR SubWord(RotWord(W[i-1])) XOR Rcon[i/Nk]
    • 对于 Nk > 6iNk 等于 4 的情况(仅适用于 AES-256):
      W[i] = W[i-Nk] XOR SubWord(W[i-1])
    • 其他情况:
      W[i] = W[i-Nk] XOR W[i-1]

这里涉及到几个辅助函数:

  • Word 32 位(4 字节)的数据单元。
  • RotWord() 对一个 32 位的 Word 进行循环左移 1 个字节。例如 [b0, b1, b2, b3] 变为 [b1, b2, b3, b0]
  • SubWord() 对一个 Word 中的每个字节应用 AES 的 S-box 替换。
  • Rcon[j] 轮常量(Round Constant)。这是一个预定义的数组,每个元素是一个 WordRcon[j] 的形式为 [rc[j], 0x00, 0x00, 0x00],其中 rc[j] 是 GF(2^8) 中的元素 x^(j-1)x 在 GF(2^8) 中表示为 0x02)。轮常量的引入是为了破坏密钥扩展过程中的对称性,防止生成相似或相关的轮密钥,抵抗相关密钥攻击(Related-key Attack)。

密钥扩展算法的设计确保了轮密钥之间具有良好的雪崩效应,即初始密钥的微小改变会导致轮密钥序列发生巨大且不可预测的变化。同时,它也保证了足够的非线性和扩散性。

AES 解密过程

AES 的解密过程本质上是加密过程的逆运算。它使用相同的密钥扩展生成的轮密钥,但以相反的顺序(从 Nr 到 0)应用。解密过程的每一轮(除了第一轮,对应加密的最后一轮)包含以下四个逆变换步骤,顺序与加密轮相反:

  1. 逆行移位(Inverse ShiftRows / InvShiftRows): 将状态矩阵的每一行进行循环右移。移动的位数与 ShiftRows 相同(第 1 行右移 1,第 2 行右移 2,第 3 行右移 3)。
  2. 逆字节替换(Inverse SubBytes / InvSubBytes): 对状态矩阵中的每个字节,使用一个逆 S-box(Inverse S-box)进行替换。逆 S-box 是 S-box 的逆运算,可以通过先应用逆仿射变换,再计算 GF(2^8) 中的乘法逆元得到。
  3. 轮密钥加(AddRoundKey): 与加密过程相同,将当前状态矩阵与当前轮(按逆序)的轮密钥进行按位异或(XOR)。因为 XOR 是其自身的逆运算,所以 AddRoundKey 的逆操作就是它本身。
  4. 逆列混合(Inverse MixColumns / InvMixColumns): 对状态矩阵的每一列进行逆向的线性变换。这相当于将每列乘以 MixColumns 使用的固定矩阵在 GF(2^8) 上的逆矩阵。
    逆混合矩阵为:
    | 0E 0B 0D 09 |
    | 09 0E 0B 0D |
    | 0D 09 0E 0B |
    | 0B 0D 09 0E |

    计算方式与 MixColumns 类似,只是使用了这个逆矩阵。

解密的整体流程如下:

  1. 密钥扩展: 同加密过程。
  2. 初始轮密钥加: 使用最后一个轮密钥(Round Key Nr)与密文块进行 AddRoundKey
  3. 主解密循环: 执行 Nr-1 轮标准的解密操作(从 Nr-1 到 1)。每一轮包含:
    • InvShiftRows
    • InvSubBytes
    • AddRoundKey (使用对应轮数的轮密钥)
    • InvMixColumns
  4. 最终解密轮: 对应加密的初始轮,只包含:
    • InvShiftRows
    • InvSubBytes
    • AddRoundKey (使用 Round Key 0)

经过以上步骤,最终得到的状态矩阵就是原始的明文块。

值得注意的是,由于 AddRoundKeyInvMixColumns 都是线性操作,它们的顺序可以交换。一些优化实现会调整 AddRoundKeyInvMixColumns 的顺序,并预先计算轮密钥与 InvMixColumns 变换的结合,形成所谓的“等效解密算法”,以提高效率。

AES 的安全性分析

自被选为标准以来,AES 经历了密码学界持续而深入的安全分析。迄今为止,对于完整的 AES(10、12 或 14 轮),尚未发现任何实际可行的、比暴力破解更有效的攻击方法。

  • 抗暴力破解: AES 的密钥长度(128、192、256 位)提供了极高的安全性。即使是 128 位密钥,其可能的密钥数量也达到了 2^128,这是一个天文数字,目前的计算能力远不足以在合理时间内进行暴力破解。
  • 抗已知密码分析攻击: AES 的设计(特别是 S-box 的非线性和 MixColumns/ShiftRows 的扩散性)使其对差分密码分析和线性密码分析具有很强的抵抗力。研究表明,要成功进行这些攻击,需要的数据量和计算复杂度都非常高,远超实际可行性。
  • 代数攻击: 一些研究者尝试通过建立描述 AES 运算的复杂代数方程组来攻击 AES。虽然理论上存在这类攻击(如 XSL 攻击),但它们通常依赖于未经验证的假设,并且对于完整轮数的 AES 而言,其复杂度仍然非常高,不构成实际威胁。
  • 相关密钥攻击: 这类攻击假设攻击者能够获取使用多个相关密钥(而非完全独立的随机密钥)加密的数据。虽然存在针对 AES 密钥扩展方案的理论性相关密钥攻击(尤其是在特定简化或降轮版本上),但对于标准 AES 及其推荐使用场景,这类攻击通常不适用或不构成严重威胁。
  • 侧信道攻击(Side-Channel Attacks): 这是目前对 AES 实现 的主要威胁。攻击者不直接分析算法本身,而是通过观察加密设备在运行过程中的物理特性(如功耗、电磁辐射、执行时间)来获取密钥信息。防御侧信道攻击需要在硬件或软件实现层面采取额外的防护措施,如加入随机掩码、使用常数时间实现等。这并非 AES 算法本身的缺陷,而是实现层面的挑战。

总的来说,AES 算法本身被认为是极其安全的。只要使用足够长的密钥(推荐 128 位或更高),并且在实现中采取了适当的侧信道防护措施,AES 就能为数据提供强大的保护。

AES 的工作模式(Modes of Operation)

AES 是一个块密码,它一次只能处理一个固定大小(128 位)的数据块。然而,现实中需要加密的数据通常远大于 128 位。为了处理任意长度的数据,并提供额外的安全特性(如防止重放攻击、保证数据完整性),需要将块密码与特定的 工作模式 结合使用。常见的工作模式包括:

  • ECB (Electronic Codebook): 最简单的模式,每个明文块独立使用相同的密钥加密。缺点: 相同的明文块会产生相同的密文块,无法隐藏数据模式,非常不安全,不推荐使用
  • CBC (Cipher Block Chaining): 每个明文块在加密前先与前一个密文块进行 XOR 操作。需要一个初始向量(IV)。提供了更好的安全性,能隐藏数据模式。
  • CFB (Cipher Feedback): 将块密码当作流密码使用。前一个密文块被加密后,其输出的一部分与当前明文段进行 XOR。也需要 IV。
  • OFB (Output Feedback): 类似于 CFB,也是将块密码作为流密码。它加密 IV,并将输出与明文 XOR;后续轮加密的是前一轮的加密器输出。也需要 IV。
  • CTR (Counter Mode): 将块密码与一个递增的计数器结合使用。加密计数器的值,然后与明文块 XOR。允许并行处理,效率高。需要一个 Nonce(Number used once)。
  • GCM (Galois/Counter Mode): 一种认证加密模式(AEAD – Authenticated Encryption with Associated Data)。它结合了 CTR 模式的加密和基于伽罗瓦域乘法的认证机制(GMAC),能同时提供数据的保密性和完整性/真实性验证。是目前广泛推荐使用的模式之一。
  • CCM (Counter with CBC-MAC): 另一种 AEAD 模式,结合了 CTR 模式加密和 CBC-MAC 认证。

选择哪种工作模式取决于具体的应用场景和安全需求(如是否需要认证、是否允许并行处理、对错误传播的敏感度等)。

AES 的应用领域

凭借其安全性、效率和标准化地位,AES 已经渗透到信息技术的方方面面,成为现代加密应用的事实标准:

  • 网络通信安全: SSL/TLS(HTTPS)、IPSec (VPNs)、SSH、Wi-Fi 安全协议(WPA2/WPA3)等都广泛使用 AES 来加密网络流量。
  • 文件和磁盘加密: 操作系统(如 BitLocker、FileVault)、加密软件(如 VeraCrypt、7-Zip)、数据库系统等使用 AES 加密存储在硬盘、U 盘或云存储上的数据。
  • 移动通信: 4G LTE 和 5G 网络标准中使用 AES 来保护信令和用户数据的安全。
  • 硬件加密: 许多现代 CPU 都内置了 AES 指令集(如 Intel AES-NI),可以极大地加速 AES 的运算,使其在性能敏感的应用中表现优异。智能卡、HSM(硬件安全模块)等也常集成 AES 硬核。
  • 消息传递应用: 一些端到端加密的消息应用(如 Signal、WhatsApp)使用 AES(通常与其他协议结合)来保护用户通信内容。
  • 数字版权管理(DRM): 用于保护音视频内容的版权。

总结

高级加密标准(AES)是现代对称密码学的杰出代表。它基于 Rijndael 算法,通过 NIST 的严格筛选和全球密码学界的广泛认可,成为了保护数字信息的全球标准。AES 以其 128 位的固定块大小、对 128/192/256 位密钥的支持、以及基于 Substitution-Permutation Network (SPN) 结构的轮函数设计,在安全性和性能之间取得了卓越的平衡。

其核心操作——SubBytes(非线性替换)、ShiftRows(行间扩散)、MixColumns(列内扩散)和 AddRoundKey(密钥混合)——共同作用,有效地抵抗了已知的各种密码分析攻击。密钥扩展算法则确保了轮密钥的随机性和复杂性。AES 的解密过程是加密的逆运算,保证了数据的可恢复性。

尽管 AES 算法本身极其安全,但在实际应用中,必须结合安全的工作模式(如 GCM 或 CCM)来处理长数据并提供认证,同时在实现层面注意防范侧信道攻击。

从保护互联网通信到加密个人文件,从移动网络安全到硬件加速,AES 已经深深融入我们数字生活的方方面面,是维护信息安全不可或缺的基石。在可预见的未来,AES 仍将继续作为最重要、最可靠的对称加密算法之一,守护着我们的数据世界。理解 AES 的原理和运作机制,对于任何关心信息安全的人来说,都是非常有价值的。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部