CAST-128 分组密码算法的轮函数设计
我将为你详细讲解CAST-128分组密码算法的轮函数设计。CAST-128是1996年由加拿大密码学家Carlisle Adams和Stafford Tavares设计的Feistel结构分组密码,被纳入RFC 2144标准,曾用于早期PGP等系统。
题目描述:
CAST-128使用64位分组和40-128位可变密钥,采用16轮Feistel结构。我们需要深入理解其独特的轮函数设计,特别是如何将密钥材料与数据混合,以及其中的非线性变换组件。
解题过程:
第一步:CAST-128的整体框架
CAST-128是经典的Feistel密码,加密过程将64位明文分成左右各32位的L₀和R₀。16轮迭代的公式为:
Lᵢ = Rᵢ₋₁
Rᵢ = Lᵢ₋₁ ⊕ F(Rᵢ₋₁, Kᵢ) (i=1,2,...,16)
其中F是轮函数,Kᵢ是第i轮的子密钥。最终密文是(R₁₆, L₁₆)。
第二步:轮函数F的输入输出结构
轮函数F接收两个输入:
- 32位数据输入(来自上一轮的右半部分)
- 32位轮密钥Kᵢ(来自密钥扩展算法)
输出为32位,用于与左半部分进行异或。
第三步:轮函数F的详细计算步骤
F函数包含三个关键操作,按顺序执行:
-
密钥加与循环移位
将32位轮密钥Kᵢ分为四个8位段:Kᵢ = {a, b, c, d}(每个8位)
但注意:实际上Kᵢ是32位,在计算时会根据轮次类型选择不同的使用方式定义两个操作:
-
类型1轮(奇数轮1,4,7,10,13,16):
将数据输入D与Kᵢ相加(模2³²),然后循环左移Kᵢ的低5位指定的位数 -
类型2轮(偶数轮2,5,8,11,14):
将数据输入D与Kᵢ异或,然后循环左移Kᵢ的低5位指定的位数 -
类型3轮(其余轮3,6,9,12,15):
从数据输入D减去Kᵢ(模2³²),然后循环左移Kᵢ的低5位指定的位数
-
-
S盒替换
将上一步得到的32位结果分成四个8位字节:I = {I₁, I₂, I₃, I₄}使用8个不同的8×32位S盒(实际上有4对S盒,但每组使用方式不同):
- S盒1和S盒2用于第一个字节操作
- S盒3和S盒4用于第二个字节操作
- S盒5和S盒6用于第三个字节操作
- S盒7和S盒8用于第四个字节操作
具体操作(以第一个字节为例):
- 从I₁中提取高4位作为S盒1的行索引
- 从I₁中提取低4位作为S盒2的列索引
- 但注意:实际实现时,每个S盒是8×32位表,所以8位输入直接映射到32位输出
实际上更准确描述:每个8位字节输入通过两个S盒的联合作用:
令x为8位输入
f₁(x) = S盒1[x的高4位] ⊕ S盒2[x的低4位]
但这是概念简化。实际上每个8位字节通过查找一个8×32位S盒表直接得到32位输出。 -
位运算组合
将四个S盒输出的32位值进行组合:- 对第1和第2个S盒输出进行按位异或
- 对第3个S盒输出减去第4个S盒输出(模2³²)
- 将上述两个结果再进行按位异或
更精确的公式:
设S₁, S₂, S₃, S₄为四个S盒输出(每个32位)
则最终输出 = (S₁ ⊕ S₂) ⊕ (S₃ ⊖ S₄) (其中⊖表示模2³²减法)
第四步:S盒的设计特点
CAST-128的S盒设计基于"随机"原则:
- 8个S盒都是8×32位(256个条目,每个32位)
- 设计目标:具有高非线性性、完全性、平衡性
- 实际设计方法:使用伪随机数生成器生成,然后测试和调整密码学性质
- 每个S盒将8位输入映射到32位输出,提供了良好的扩散效果
第五步:轮密钥的使用细节
在轮函数中,32位轮密钥Kᵢ不仅参与初始的加/减/异或操作,其低5位还决定了循环移位的位数(0-31位)。这种设计增加了算法对密钥的依赖性。
第六步:完整计算示例(概念性)
假设第i轮:
- 数据输入D = 0x12345678
- 轮密钥Kᵢ = 0x9ABCDEF0(假设是类型1轮)
- 计算中间值:T = (D + Kᵢ) mod 2³² = 0xACF13568
- 循环左移:s = Kᵢ的低5位 = 0xF0 & 0x1F = 0x10 = 16
T = ROL(T, 16) = 0x3568ACF1 - 分成四个字节:I₁=0x35, I₂=0x68, I₃=0xAC, I₄=0xF1
- 查S盒得32位输出:
S₁ = S-box1[I₁], S₂ = S-box2[I₂], S₃ = S-box3[I₃], S₄ = S-box4[I₄] - 组合:F = (S₁ ⊕ S₂) ⊕ (S₃ ⊖ S₄)
第七步:安全性设计考虑
- 三种不同类型的轮操作(加、减、异或)增加了算法的混合强度
- 循环移位位数由密钥决定,增加了密钥依赖性
- 8个大型S盒提供强非线性
- Feistel结构保证了解密与加密的对称性
- 16轮迭代提供足够的雪崩效应
总结:CAST-128轮函数设计的核心在于其类型多变的密钥混合操作、密钥相关的循环移位,以及8个大型S盒提供的强非线性变换。这种设计在当时提供了良好的安全性和效率平衡,尽管现在已不再推荐用于高安全需求场景(密钥长度最多128位,且存在一些密码分析结果)。