ARIA 分组密码算法的加解密流程详解
我将为您详细讲解 ARIA 算法完整的加解密流程。ARIA 是一种由韩国学者设计的 128 比特分组密码算法,支持 128、192 和 256 比特三种密钥长度。其整体结构为 SPN(代换-置换网络),加解密流程高度对称但略有不同,这使其设计精巧高效。
一、 算法总体框架与核心概念
-
基本参数:
- 分组长度:固定为 128 比特。
- 密钥长度:128 比特(对应 12 轮)、192 比特(对应 14 轮)、256 比特(对应 16 轮)。轮数记为
nr。 - 数据表示:128 比特的明文、中间状态、密文都表示为 4x4 的字节矩阵(16 字节),类似于 AES。
-
核心操作:ARIA 的轮函数(
Round Function)由三种基本变换组成:- Substitution Layer (S-layer):使用两个不同的 8x8 S盒(S1 和 S2)及其逆 S盒(S1⁻¹ 和 S2⁻¹)对状态矩阵的每个字节进行非线性替换。
- Diffusion Layer (D-layer):一个精心设计的线性变换,作用于整个 128 比特状态,提供扩散性。这是加解密流程不同的关键点。
- Round Key Addition (A-layer):将 128 比特的轮密钥与状态进行简单的比特异或(XOR)。
二、 加密过程详解(循序渐进)
加密过程是 奇数轮 和 偶数轮 交替进行的 nr 轮迭代,前后各有一个白化密钥加操作。
步骤 0:初始准备
明文 P (128 bit) 被加载到状态矩阵 State 中。首先生成所有的轮密钥 RK[0], RK[1], ..., RK[nr](通过密钥扩展算法,此处假定已生成)。
步骤 1:初始密钥加(Whitening)
State = State XOR RK[0]。
这是第一轮白化操作,增加攻击难度。
步骤 2:主轮循环(对于轮数 r = 1 到 nr-1)
主循环执行 nr-1 轮。每轮包含三个子步骤,但奇数轮和偶数轮的 S 盒使用顺序相反。
-
奇数轮(r=1,3,5,...):
- S-layer (Substitution):对
State的 16 个字节应用 S 盒。- 规则:使用两个不同的 S 盒 S1 和 S2。具体地,对状态矩阵的行
i(从0开始),如果i mod 4的值为 0 或 1,则对该行的 4 个字节使用 S1;如果值为 2 或 3,则使用 S2。 - 作用:引入非线性,混淆数据。
- 规则:使用两个不同的 S 盒 S1 和 S2。具体地,对状态矩阵的行
- D-layer (Diffusion):对整个
State应用线性扩散变换DL。- 定义:
DL是一个 128x128 的二进制矩阵乘法(在 GF(2) 上)。它将一个 128 比特的向量(状态的列优先表示)映射到另一个 128 比特向量。 - 设计:
DL矩阵是 Maximum Distance Separable (MDS) 矩阵,具有良好的分支数,确保单个输入字节的改变在经过DL后能影响到多个输出字节。 - 作用:提供雪崩效应和扩散性。
- 定义:
- A-layer (AddRoundKey):
State = State XOR RK[r]。
- S-layer (Substitution):对
-
偶数轮(r=2,4,6,...):
- S-layer (Substitution):与奇数轮相反。行
i mod 4值为 0 或 1 时,使用 S2;值为 2 或 3 时,使用 S1。 - D-layer (Diffusion):与加密奇数轮完全相同,应用同一个
DL变换。 - A-layer (AddRoundKey):
State = State XOR RK[r]。
- S-layer (Substitution):与奇数轮相反。行
步骤 3:末轮处理(第 nr 轮)
最后一轮(第 nr 轮)比较特殊,它只包含 S-layer 和 A-layer,省略了 D-layer。
- 根据
nr的奇偶性决定 S 盒的使用规则(奇同奇数轮,偶同偶数轮)。 - 执行:
State = S-layer(State),然后State = State XOR RK[nr]。
步骤 4:输出
此时 State 即为最终的密文 C。
加密流程小结(公式化):
C = (XOR_RK[nr]) ∘ S_nr ∘ (XOR_RK[nr-1] ∘ DL ∘ S_{nr-1}) ∘ ... ∘ (XOR_RK[1] ∘ DL ∘ S_1) ∘ (XOR_RK[0]) (P)
其中 S_r 表示第 r 轮的 S 盒层(奇偶规则不同),DL 为扩散层,XOR_RK[r] 为与轮密钥 RK[r] 异或。
三、 解密过程详解(与加密的对称性)
ARIA 的解密流程与加密流程高度相似,核心思想是按逆序使用轮密钥,并将每轮的变换替换为其逆变换。
关键点:
-
逆变换:
- S-layer 的逆:使用 S 盒的逆 S盒。即,在解密时,如果加密轮使用了 S1,则对应的解密轮就使用 S1⁻¹;如果加密使用了 S2,则解密使用 S2⁻¹。奇偶轮的规则与加密时保持一致。
- D-layer 的逆:扩散层
DL是线性变换,其逆变换存在,记为DL⁻¹。这是加解密流程中 D-layer 唯一不同的地方。解密时使用DL⁻¹而不是DL。 - A-layer 的逆:异或操作的逆就是它自身(再次异或相同的密钥)。
-
步骤顺序与密钥顺序:
- 解密从“末轮”开始,向“首轮”进行。
- 轮密钥的使用顺序与加密相反。
解密步骤分解:
步骤 0:准备
密文 C 加载到 State。轮密钥 RK[0]...RK[nr] 已准备。
步骤 1:初始密钥加(解密对应加密的末轮)
State = State XOR RK[nr]。 // 对应加密末轮的 XOR_RK[nr]
步骤 2:末轮 S 盒逆变换(解密对应加密的末轮 S-layer)
根据 nr 的奇偶性,应用对应的逆 S 盒层 Inv_S_nr(规则同加密末轮,但用 S⁻¹)。
步骤 3:主轮循环(对于轮数 r = nr-1 降到 1)
这是解密的核心循环,执行 nr-1 轮。每轮包含:
- A-layer (AddRoundKey):
State = State XOR RK[r]。 // 使用当前轮次r的密钥 - D-layer (Diffusion):应用逆扩散变换
DL⁻¹。 // 与加密唯一不同的核心操作 - S-layer (Substitution):应用逆 S 盒层
Inv_S_r。S盒使用的奇偶规则与加密第r轮时完全相同(但用的是逆S盒)。
步骤 4:最终密钥加(解密对应加密的初始白化)
State = State XOR RK[0]。
步骤 5:输出
此时 State 即为恢复的明文 P。
解密流程小结(公式化):
P = (XOR_RK[0]) ∘ (Inv_S_1 ∘ DL⁻¹ ∘ XOR_RK[1]) ∘ ... ∘ (Inv_S_{nr-1} ∘ DL⁻¹ ∘ XOR_RK[nr-1]) ∘ (Inv_S_nr ∘ XOR_RK[nr]) (C)
四、 加解密对称性验证(为什么这样设计是正确的?)
我们可以直观理解其正确性。观察一对加密轮(第 r 轮,假设不是首末轮)及其对应的解密操作。加密轮为:S ∘ DL ∘ XOR_RK[r]。
为了解密,我们需要构造其逆:(XOR_RK[r] ∘ DL ∘ S)^(-1)。
根据运算性质:
(S ∘ DL ∘ XOR_RK[r])^(-1) = (XOR_RK[r])^(-1) ∘ (DL)^(-1) ∘ (S)^(-1) = XOR_RK[r] ∘ DL⁻¹ ∘ Inv_S。
这正是解密流程中每一轮(从后往前)所做的:Inv_S 然后 DL⁻¹ 然后 XOR_RK[r]。注意顺序是反的,因为解密是从最后一轮开始反向执行。首轮和末轮由于缺少 DL 或 DL⁻¹,处理方式也严格对应。
这种设计使得 ARIA 的加解密结构非常规整,硬件实现时可以复用大部分电路(只需要同时提供 S 盒、逆 S 盒以及 DL 和 DL⁻¹ 的电路),在资源受限和高速实现中都有优势。