SM4分组密码算法的密钥扩展算法中常数FK与CK的详细作用与设计依据
字数 2318 2025-12-14 17:01:58
SM4分组密码算法的密钥扩展算法中常数FK与CK的详细作用与设计依据
题目描述
SM4是中国国家商用密码算法标准中的一种分组密码算法,其分组长度为128比特,密钥长度也为128比特。在密钥扩展过程中,算法使用了两个关键的常数集合:FK(固定密钥)和CK(常量密钥)。题目要求详细解释FK和CK在密钥扩展算法中的作用,并阐述它们的设计依据(如数学性质、安全性考虑等)。
解题过程
我们将循序渐进地讲解FK和CK的作用、计算方式及其设计原理。
1. SM4密钥扩展算法概览
SM4的密钥扩展算法用于从一个128比特的主密钥(MK)生成32个轮密钥(rk0, rk1, ..., rk31),每个轮密钥为32比特。这个过程分为两步:
- 初始化变换:利用常数FK,将主密钥MK转换为一个中间状态(K0, K1, K2, K3)。
- 迭代生成轮密钥:利用常量CK,通过轮函数F对中间状态进行迭代,生成32个轮密钥。
FK和CK是算法的固定参数,不依赖于主密钥,其目的是消除密钥中的对称性,增强算法抵抗相关密钥攻击等密码分析的能力。
2. 常数FK的作用与计算
作用:
- FK用于在密钥扩展的初始化阶段,与主密钥MK进行异或操作,打破MK可能存在的结构或模式(例如,全0、全1或低熵密钥),增加密钥材料的随机性。
- 这能确保即使主密钥具有某种规律性,经过FK的混淆后,生成的中间状态也会变得无规律,从而提高轮密钥的伪随机性。
FK的具体值:
FK由四个32比特的常数组成(FK0, FK1, FK2, FK3),其值以十六进制表示如下:
FK0 = 0xA3B1BAC6
FK1 = 0x56AA3350
FK2 = 0x677D9197
FK3 = 0xB27022DC
这些值是通过在密码学中常用的常数(如自然常数e、圆周率π的十六进制表示)中选取特定片段得到的,以尽可能避免任何隐藏的后门或结构。
计算步骤:
- 将128比特主密钥MK分为四个32比特字:MK = (MK0, MK1, MK2, MK3)。
- 计算中间状态K:
这里⊕表示按位异或(XOR)操作。K0 = MK0 ⊕ FK0 K1 = MK1 ⊕ FK1 K2 = MK2 ⊕ FK2 K3 = MK3 ⊕ FK3
设计依据:
- 消除对称性:如果主密钥是全0(MK=0),则中间状态K就是FK本身,而FK是精心选择的、看似随机的常数,从而避免了轮密钥全0的弱密钥情况。
- 数学无关性:FK的取值与算法中的S盒、线性变换L等组件无直接代数关系,减少了潜在的相关性攻击面。
- 简单高效:仅使用异或操作,计算开销极低,适合软硬件实现。
3. 常数CK的作用与计算
作用:
- CK在密钥扩展的迭代轮中作为轮常数输入,每一轮使用不同的CK值,确保各轮密钥生成过程具有差异性,防止轮密钥之间的简单关系。
- 通过引入轮常数,可以抵抗滑动攻击(slide attacks),因为攻击者无法通过简单的“滑动”模式在不同轮之间建立等价关系。
CK的生成方法:
CK是一个包含32个32比特常数的数组(CK0, CK1, ..., CK31)。每个CK_j通过以下方式生成:
- 设CK_{j,i}表示CK_j的第i个字节(i=0,1,2,3),其中CK_j = (CK_{j,0}, CK_{j,1}, CK_{j,2}, CK_{j,3})。
- 计算:
即,每个字节是(4j + i)乘以7后对256取模的结果。这里j是轮数(0 ≤ j ≤ 31),i是字节索引。CK_{j,i} = (4j + i) * 7 (mod 256)
示例:对于第0轮(j=0):
- i=0: CK_{0,0} = (40 + 0) 7 mod 256 = 0
- i=1: CK_{0,1} = (40 + 1) 7 mod 256 = 7
- i=2: CK_{0,2} = (40 + 2) 7 mod 256 = 14
- i=3: CK_{0,3} = (40 + 3) 7 mod 256 = 21
因此,CK0 = 0x00070E15。
设计依据:
- 线性无关序列:CK的生成公式(4j+i)*7 mod 256产生一个伪随机的字节序列。乘法因子7是一个在模256下与256互质的小奇数,确保该函数是一个满射(即输出覆盖0-255所有值),从而CK各字节在统计上分布均匀。
- 简单性与确定性:生成规则非常简单,无需存储整个CK表(可实时计算),节省内存,且易于验证。
- 抵抗弱密钥:通过轮常数引入非线性(相对于主密钥),使得即使主密钥有特殊值,轮密钥也会因CK的加入而产生足够的变化。
4. 密钥扩展的完整过程
结合FK和CK,SM4密钥扩展的步骤如下:
- 初始化:
(K0, K1, K2, K3) = (MK0⊕FK0, MK1⊕FK1, MK2⊕FK2, MK3⊕FK3) - 迭代生成轮密钥(对j从0到31循环):
- 计算轮密钥:
rk_j = K_{j+4} = K_j ⊕ T'(K_{j+1} ⊕ K_{j+2} ⊕ K_{j+3} ⊕ CK_j) - 其中T'是一个与加密轮函数类似但更简化的变换,由非线性变换τ(4个8进8出S盒)和线性变换L'(L'(B) = B ⊕ (B<<<13) ⊕ (B<<<23))组成。
- 计算轮密钥:
整个过程结束后,得到32个轮密钥rk_j (j=0,...,31)。
5. 安全性考量总结
- 抗相关密钥攻击:FK和CK的引入使得轮密钥与主密钥之间的相关性变得复杂,攻击者难以通过操纵主密钥来预测轮密钥之间的差异。
- 抗滑动攻击:CK确保每一轮的密钥扩展过程都不同,防止了“滑动”现象。
- 避免弱密钥:FK和CK的固定值经过精心选择,与算法其他组件配合,确保不存在明显的弱密钥集合(例如,使得轮密钥全等或循环的密钥)。
- 效率与简洁:设计兼顾了安全性和实现效率,FK是预定义的常数,CK可通过简单公式生成,适合资源受限环境。
通过以上步骤,我们详细剖析了SM4密钥扩展中FK和CK的作用、计算方式及其设计依据。理解这些常数有助于深入掌握SM4算法的安全设计思想。