MARS 分组密码算法的密钥扩展过程详解
字数 1770 2025-12-20 06:02:58
MARS 分组密码算法的密钥扩展过程详解
一、算法背景
MARS 是 IBM 为参与 AES 竞赛提交的分组密码算法,采用 128 比特分组、128–448 比特可变密钥长度(AES 竞赛限定 128/192/256 比特)。其核心结构结合了 Feistel 网络、SP 网络 和 密钥加/密钥乘 操作,密钥扩展过程负责将用户密钥扩展为 40 个 32 比特字 的轮密钥(K[0]...K[39]),用于后续的加解密流程。
二、密钥扩展整体步骤
设用户密钥长度为 m 字节(16 ≤ m ≤ 56),密钥扩展分为四个阶段:
- 密钥填充与初始数组生成
- 线性扩散变换
- 非线性 S 盒混合
- 轮密钥派生与重排
三、逐步详解
步骤 1:密钥填充与初始数组生成
- 将用户密钥按 字节 读入数组
Key[0…m-1]。 - 计算需要扩展的 32 比特字数量:
- 设
n = ⌈m/4⌉,即密钥按 4 字节对齐后的字个数。 - 例如 128 比特(16 字节)密钥:n = 4。
- 设
- 将密钥字节转为 大端序 32 比特字数组
T[0…n-1]。- 例如
Key[0..3]依次作为T[0]的最高位到最低位字节。
- 例如
- 追加固定常量
0x9E3779B9(黄金比例倒数)作为T[n],并设置T[n+1…14]初始为 0。- 最终
T数组长度为 15 个字(0–14)。
- 最终
步骤 2:线性扩散变换
目标:通过循环移位和异或使密钥比特充分扩散。
- 执行 4 轮循环(每轮对 T[0…14] 进行更新):
其中for i = 0 to 14: T[i] = T[i] XOR ((T[(i-7) mod 15] XOR T[(i-2) mod 15]) <<< 3) XOR (4*i + j)j为轮次索引(0–3),<<< 3表示循环左移 3 位。 - 此步骤确保每个
T[i]依赖于多个其他字,增加线性扩散性。
步骤 3:非线性 S 盒混合
MARS 使用 两个 512 项的 S 盒:
S0[512]:基于 3x+1 映射与固定置换生成。S1[512]:基于 5x+1 映射与固定置换生成。
(S 盒生成算法独立于密钥,此处省略细节)
混合过程:
- 对
T[0…14]执行 10 轮循环(每轮更新全部 15 个字):- 每轮中,依次处理
T[0]…T[14],对当前字T[i]:
a. 取T[i]的 最低 9 比特 作为索引idx = T[i] & 0x1FF。
b. 若 i 为偶数,查S0[idx];若 i 为奇数,查S1[idx]。
c. 将查表结果与T[(i+1) mod 15]异或,并循环左移 1 位。
d. 结果写回T[i]。
- 每轮中,依次处理
- 此步骤引入 非线性,打破线性扩散的规律性。
步骤 4:轮密钥派生与重排
- 经过前几步,
T[0…14]已充分混合。从中选取 10 个字 作为 核心密钥:- 取
T[4], T[5], T[6], T[7], T[8], T[9], T[10], T[11], T[12], T[13]。
- 取
- 通过这 10 个字 扩展生成 40 个轮密钥字 K[0…39]:
- 使用线性递归与固定偏移:
其中for i = 0 to 39: j = i mod 10 K[i] = T[j] XOR (T[(j+3) mod 10] <<< 17) XOR constant[i]constant[i]为预计算的常量(与 i 相关的小素数模 2^32)。
- 使用线性递归与固定偏移:
- 最终调整:
- 对部分轮密钥(用于乘法运算的轮)进行 掩码处理,确保其最低 3 比特为
101b(二进制),避免乘法运算的弱密钥。
- 对部分轮密钥(用于乘法运算的轮)进行 掩码处理,确保其最低 3 比特为
四、轮密钥在加密中的使用
MARS 加密分为:
- 前向混合(8 轮):使用 K[0…7] 进行密钥加与 S 盒混淆。
- 核心加密(8 轮):使用 K[8…31] 进行 Feistel 类运算,包含 密钥乘(模 2^32乘法)和 密钥加。
- 后向混合(8 轮):使用 K[32…39] 进行逆向密钥加与 S 盒混淆。
密钥扩展确保每个轮密钥与用户密钥高度非线性相关。
五、安全性要点
- 抗相关攻击:线性扩散与非线性混合结合,防止密钥比特的线性追踪。
- 抗弱密钥:通过 S 盒混合和掩码处理,避免乘法运算的退化情况。
- 适应性:支持可变长度密钥,扩展过程均转化为固定长度的中间数组,确保一致性。
通过以上步骤,MARS 将用户密钥转换为 40 个轮密钥,为其复杂的加解密轮函数提供充分随机化的密钥材料。