SM4分组密码算法的线性变换L设计
字数 1459 2025-11-10 12:18:08
SM4分组密码算法的线性变换L设计
SM4是一种分组密码算法,其分组长度为128位,密钥长度为128位。线性变换L是SM4轮函数中的重要组成部分,负责提供扩散性。下面详细讲解线性变换L的设计。
1. SM4轮函数结构回顾
SM4的轮函数结构为非线性变换τ与线性变换L的组合。每轮输入为32位字\(X_i\)(i=0,1,2,3),轮密钥为\(rk_i\)。轮函数输出为:
\[X_{i+4} = F(X_i, X_{i+1}, X_{i+2}, X_{i+3}, rk_i) = X_i \oplus T(X_{i+1} \oplus X_{i+2} \oplus X_{i+3} \oplus rk_i) \]
其中,\(T\)是合成变换,由非线性变换τ和线性变换L复合而成:
\[T(.) = L(\tau(.)) \]
2. 线性变换L的数学定义
线性变换L是一个32位到32位的线性映射,定义为:
\[L(B) = B \oplus (B \lll 2) \oplus (B \lll 10) \oplus (B \lll 18) \oplus (B \lll 24) \]
其中:
- \(B\)是32位的输入(即非线性变换τ的输出);
- \(\lll\)表示循环左移(左移位数指定位数,高位补到低位);
- 异或(\(\oplus\))操作提供比特混合。
3. 设计原理分析
线性变换L的设计目标是通过循环左移和异或操作实现高扩散性,确保输入比特的微小变化能快速传播到多个输出比特。具体分析:
- 循环左移参数选择:移位数2、10、18、24是经过精心设计的质数或互质数,避免移位后的比特重叠模式过于简单,从而增强混乱效果。
- 异或操作:将原数据与多个移位后的版本异或,使每个输出比特依赖于输入的多位(至少5个不同位置的比特)。
- 分支数:L变换具有较高的分支数(输入变化1比特时,输出平均变化比特数较大),符合分组密码的扩散准则。
4. 计算示例
假设输入\(B = 0x12345678\)(32位十六进制数),计算\(L(B)\)的步骤:
- 将B转换为二进制:
\(B = 0001\_0010\_0011\_0100\_0101\_0110\_0111\_1000\)(每4位为一组,共32位)。 - 计算循环左移:
- \(B \lll 2\):左移2位,高2位补到低位;
- \(B \lll 10\):左移10位;
- \(B \lll 18\):左移18位;
- \(B \lll 24\):左移24位。
- 将所有移位结果与B异或:
\[ L(B) = B \oplus (B \lll 2) \oplus (B \lll 10) \oplus (B \lll 18) \oplus (B \lll 24) \]
实际计算需按位异或,最终得到32位输出。
5. 在SM4中的作用
- 与τ变换结合:非线性变换τ(由4个8进8出的S盒并行构成)提供混淆,L变换将S盒的输出扩散到整个字,避免局部依赖性。
- 抵抗密码分析:线性变换L的复杂性和高扩散性有效抵御差分密码分析和线性密码分析。
6. 安全性考虑
- 若仅用S盒而无线性变换,比特变化将局限于S盒内部,易被攻击。L变换确保单比特变化能影响多个S盒的输出。
- 移位数和异或次数经过优化,平衡了硬件效率与安全性。
通过以上步骤,线性变换L在SM4中实现了高效的扩散,是算法安全性的核心组件之一。