SM3密码杂凑算法的填充与迭代过程
字数 990 2025-11-07 12:33:00
SM3密码杂凑算法的填充与迭代过程
SM3是中国国家密码管理局发布的密码杂凑算法,输出长度为256位。其填充与迭代过程确保任意长度的输入消息都能被处理为固定长度的杂凑值。下面详细讲解这一过程。
1. 消息填充
SM3要求消息长度在填充后是512位(64字节)的整数倍。填充规则如下:
- 在消息末尾添加一个比特“1”。
- 添加k个比特“0”,其中k是满足以下等式的最小非负整数:
\[ \text{消息长度} + 1 + k \equiv 448 \pmod{512} \]
这里448是因为预留64位用于记录消息原始长度。
3. 追加64位消息长度(以大端序表示原始消息的比特长度)。
示例:假设消息长度为40字节(320比特)。
- 添加“1”:320 + 1 = 321比特。
- 计算k:321 + k ≡ 448 (mod 512) → k = 127。
- 填充后总长度:320 + 1 + 127 + 64 = 512比特(恰好1个分组)。
2. 迭代压缩
填充后的消息被划分为512位的分组\(B_0, B_1, \dots, B_{n-1}\),每个分组通过压缩函数\(CF\)处理,并与前一个输出的256位中间值(初始为IV)迭代计算:
- 初始化8个32位寄存器(A~H)为固定初始值IV。
- 对每个分组执行以下步骤:
- 消息扩展:将512位分组划分为16个32位字\(W_0 \dots W_{15}\),并扩展生成132个字(\(W_0 \dots W_{67}\)和\(W_0' \dots W_{63}'\)),用于后续轮运算。
- 64轮压缩:每轮使用一个扩展字\(W_j\)和常量\(T_j\),通过非线性函数、循环移位等操作更新寄存器A~H。
- 与上一轮结果叠加:压缩后的寄存器值与初始值(本轮处理前的A~H)逐字模加。
- 最终输出:最后一个分组的处理结果即为256位杂凑值。
3. 关键设计特点
- 抗碰撞性:填充规则确保消息长度信息被嵌入,防止长度扩展攻击。
- 迭代结构:类似Merkle-Damgård结构,但通过多轮非线性操作增强安全性。
- 常量与函数:压缩函数使用布尔函数、置换操作和常量移位,确保雪崩效应。
通过以上步骤,SM3将任意长度消息转换为唯一且不可逆的杂凑值,适用于数字签名、消息认证等场景。