概述
SM3密码(杂凑)算法:输入是长为(
)bit的消息
,填充、迭代压缩后,输出是256bit的杂凑值。
杂凑函数:又称哈希函数、散列函数、消息摘要算法,将任意长的输入串转换为固定长度的输出串(杂凑值、哈希值,指输入串的“指纹”),用于认证。
一、SM3算法步骤
1. 填充
由于输入无统一长度,故需要填充使它满足后续处理要求,将填充后消息记为
。
具体操作:首先将输入消息转换为二进制,将“1”添加至消息末尾,再添加个0,
要满足
(左边的和对512取余得448)、最小非负整数。在分组里还剩64位,这64位bit串是原始消息长度
的二进制表示。填充后,
的比特长度为512的倍数。
总结: =
+‘1’+合适个数的‘0’+64位原长二进制表示
2. 分块
对进行分块,每512bit为一组,共计
组(
)。
具体操作:=
。每个
代表填充后的一个消息分组。
3. 迭代运算
对分块后的每一组进行迭代运算,最终得到256bit的杂凑值。
CF函数(压缩函数):负责将输入分组压缩成固定的哈希值,同时通过非线性变换增强哈希值的安全性。
具体操作:若,则明文只有一个512bit分组(
),最终杂凑值
。若有多块
,则进行n轮迭代运算,最终杂凑值
。
FOR |
|
ENDFOR |
设置为256bit哈希值的初始值
。
二、具体运算流程
首先,SM3算法整体运算以32bit为单位进行,故定义32bit为一个字(字母X表示),一个消息分组(512bit)为16(512/32=16)个字。SM3算法中基本用到的运算符如下表:
符号 | 含义 |
32bit 的与运算 | |
32bit 的或运算 | |
32bit 的异或运算 | |
mod | |
32bit 的非运算 | |
32bit 循环左移 | |
左向赋值 |
1. 初始值
上述每一位均为16进制(4bit),故按照8位划分为一个字,分别用ABCDEFGH表示。
2. 消息扩展
未扩展前,一个消息分组是512bit(16个字)。需要将它扩展为132个字,一个字用
表示。
前16个字:到
,就是原消息分组
的16个字;
第17个字到第68个字:到
,按照如下运算:
第69个字到第132个字:到
,按照如下运算:
上式中,为置换函数,操作如下。其中,
表示一个字:
3. 压缩函数
令A,B,C,D,E,F,G,H分别为字寄存器(大端格式存储,big-endian),SS1,SS2,TT1,TT2为中间变量,使用压缩函数时有通式:
其具体计算过程如下:
FOR |
|
|
|
|
|
|
|
|
|
|
|
|
ENDFOR |
相当于处理后的ABCDEFGH和原异或得到新的
。
上式中,是常量,
和
是布尔函数(以对字X、Y、Z操作示例):