一、分组密码结构概述
分组密码的核心设计目标是在扩散 和混淆之间取得平衡:
-
扩散:使明文的统计特性消散在密文中(雪崩效应)
-
混淆:使密文与密钥之间的关系尽可能复杂
二、主要结构类型详解
1. Feistel 网络结构
原理示意图
明文 (2n位)
↓
分成L0和R0两部分 (各n位)
轮函数迭代:
L_i = R_{i-1}
R_i = L_{i-1} ⊕ F(R_{i-1}, K_i)
最终输出:
密文 = R_r || L_r (最后一轮不交换)
核心特点
-
加解密相似性:加密和解密使用相同结构,仅子密钥顺序相反
-
轮函数F不必可逆:为设计提供极大灵活性
-
平衡性:每轮处理一半数据位
代表性算法
-
DES:16轮Feistel结构,64位分组,56位密钥
-
3DES:3次DES加密,安全性增强
-
Blowfish:16轮Feistel,可变长密钥
-
FEAL:早期日本设计的Feistel密码
2. SPN 结构
原理示意图
明文
↓
轮密钥加 → 子密钥异或
↓
代替层 → S盒非线性变换
↓
置换层 → 线性扩散层
↓
重复r-1轮
↓
最后一轮(无置换层)
↓
密文
核心特点
-
多层处理:依次进行代替和置换操作
-
高并行性:所有S盒可并行计算
-
快速扩散:一轮内影响整个数据块
代表性算法
-
AES:最著名的SPN结构,128位分组,10/12/14轮
-
SHARK:AES的前身
-
Square:AES的直接前身
-
Serpent:AES竞赛决赛算法,更保守的设计
3. Lai-Massey 结构
原理示意图
左半部分L0,右半部分R0
每轮操作:
L_i = L_{i-1} ⊕ F(L_{i-1} ⊟ R_{i-1}, K_i)
R_i = R_{i-1} ⊕ F(L_{i-1} ⊟ R_{i-1}, K_i)
其中⊟是群运算(通常是异或或模减)
核心特点
-
类似Feistel的对称结构:但两半数据都参与轮函数计算
-
群运算要求:需要定义合适的群运算
-
较少使用:主要见于特定算法
代表性算法
-
IDEA:最著名的Lai-Massey结构算法,64位分组,128位密钥
-
FOX:基于Lai-Massey的现代算法
4. ARX 结构
原理示意图
数据块分割成字
每轮操作:
模加 → 循环移位 → 异或
重复多轮
核心特点
-
极简操作:仅使用加法、循环移位、异或
-
软件友好:在现代CPU上高效
-
分析困难:混合不同代数结构的操作
代表性算法
-
Speck:轻量级ARX密码,NSA设计
-
SIMON:与Speck同系列的轻量级密码
-
Threefish:Skein哈希函数的核心
5. 其他混合结构
广义Feistel网络
-
将数据分成更多部分(如4路、8路)
-
每轮只更新部分数据
-
代表:CAST-256, CLEFIA
替代结构
-
MISTY结构:在Feistel中嵌套Feistel
-
WHIRLPOOL:基于AES设计的哈希函数
三、结构对比分析
结构特性比较表
结构类型 | 加解密相似性 | 轮函数可逆性要求 | 并行性 | 扩散速度 | 实现复杂度 |
---|---|---|---|---|---|
Feistel | 完全相似 | 不要求 | 中等 | 较慢(半块/轮) | 低 |
SPN | 不相似 | 必须可逆 | 高 | 快(全块/轮) | 中高 |
Lai-Massey | 相似 | 要求部分可逆 | 中等 | 中等 | 中 |
ARX | 通常相似 | 不要求 | 高 | 中等 | 极低 |
密码学特性比较
结构类型 | 抗差分分析 | 抗线性分析 | 抗侧信道攻击 | 设计灵活性 |
---|---|---|---|---|
Feistel | 中等 | 中等 | 中等 | 高 |
SPN | 强 | 强 | 中等 | 中等 |
Lai-Massey | 强 | 强 | 中等 | 低 |
ARX | 中等 | 中等 | 强 | 中等 |
四、代表性算法深度分析
DES (Feistel结构)
c
// DES轮函数核心
uint32_t feistel_function(uint32_t right, uint64_t round_key) {
// 1. 扩展置换 (32位→48位)
uint64_t expanded = expansion(right);
// 2. 与轮密钥异或
expanded ^= round_key;
// 3. S盒代替 (8个6位→4位的S盒)
uint32_t substituted = s_boxes(expanded);
// 4. P盒置换
return permutation(substituted);
}
AES (SPN结构)
c
// AES轮函数
void aes_round(uint8_t state[16], const uint8_t round_key[16]) {
// 1. 字节代替 (S盒)
sub_bytes(state);
// 2. 行移位
shift_rows(state);
// 3. 列混合 (除最后一轮)
mix_columns(state);
// 4. 轮密钥加
add_round_key(state, round_key);
}
五、现代设计趋势
1. 轻量级密码
-
目标:资源受限环境(物联网、RFID)
-
技术:简化轮函数、减少轮数、紧凑实现
-
代表:PRESENT, SIMON, SPECK
2. 硬件优化设计
-
目标:最大化吞吐量或最小化面积
-
技术:比特切片、流水线、低功耗设计
-
代表:PRINCE, MIDORI
3. 抗侧信道攻击
-
目标:抵抗时序、功耗、电磁分析
-
技术:掩码、隐藏、恒定时间实现
-
代表:ASCON, GIFT
六、选择建议
应用场景推荐
应用场景 | 推荐结构 | 代表算法 | 理由 |
---|---|---|---|
通用加密 | SPN | AES | 性能优异,广泛支持,安全性强 |
遗留系统 | Feistel | 3DES | 兼容性需求 |
资源受限 | ARX | SPECK | 代码量小,功耗低 |
学术研究 | 各种结构 | 新算法 | 探索新设计空间 |
硬件实现 | SPN/Feistel | AES/PRESENT | 平衡面积和性能 |
设计考量因素
-
安全性:抵抗已知攻击的能力
-
性能:软件/硬件实现效率
-
灵活性:支持不同平台和用例
-
简洁性:易于分析、实现和验证
-
标准化:产业支持和认可程度
七、总结
分组密码的结构选择是密码算法设计的核心决策:
-
Feistel网络:以其加解密相似性和设计灵活性著称,适合需要对称实现和渐进改进的场景
-
SPN结构:提供快速的扩散和强安全性证明,是现代密码学的主流选择
-
ARX结构:以其极简设计和软件友好性,在轻量级密码领域表现出色
-
Lai-Massey结构:在某些特定应用中提供独特的安全平衡
现代实践建议 :对于新项目,AES(SPN结构) 通常是首选,因其在安全性、性能和生态系统支持方面的综合优势。对于特定需求(如极度资源受限),可考虑经过充分分析的轻量级ARX密码如SPECK。