SM3密码算法:简介、步骤、压缩函数、布尔函数

自学笔记,原文来自http://【【SM3加密算法】|密码杂凑算法 | Hash算法 | 密码学 | 信息安全| 消息摘要】 https://www.bilibili.com/video/BV1gi4y1C7zf/?share_source=copy_web&vd_source=28085dd9af51f6380e7015f6ce79d61b

概述

SM3密码(杂凑)算法:输入是长为ll< 2^{64})bit的消息m,填充、迭代压缩后,输出是256bit的杂凑值。

杂凑函数:又称哈希函数、散列函数、消息摘要算法,将任意长的输入串转换为固定长度的输出串(杂凑值、哈希值,指输入串的“指纹”),用于认证。

一、SM3算法步骤

1. 填充

由于输入m无统一长度,故需要填充使它满足后续处理要求,将填充后消息记为m^{'}

具体操作:首先将输入消息转换为二进制,将“1”添加至消息末尾,再添加k个0,k要满足l+1+k\equiv 448(mod 512)(左边的和对512取余得448)、最小非负整数。在分组里还剩64位,这64位bit串是原始消息长度l的二进制表示。填充后,m^{'}的比特长度为512的倍数。

总结:m = m^{'}+‘1’+合适个数的‘0’+64位原长二进制表示

2. 分块

m^{'}进行分块,每512bit为一组,共计n组(n=(l+k+65)\div 512)。

具体操作:m^{'}=B^{0}B^{1}\cdots B^{n-1}。每个B^{i}代表填充后的一个消息分组。

3. 迭代运算

对分块后的每一组进行迭代运算,最终得到256bit的杂凑值。

CF函数(压缩函数):负责将输入分组压缩成固定的哈希值,同时通过非线性变换增强哈希值的安全性。

具体操作:若n=1,则明文只有一个512bit分组(B^{0}),最终杂凑值V^{1}=CF(V^{0},B^{0})。若有多块n\neq 1,则进行n轮迭代运算,最终杂凑值V^{n}

FOR   i=0   TO   n-1
        V^{i+1}=CF(V^{i},B^{i})
ENDFOR

设置V^{0}为256bit哈希值的初始值IV

二、具体运算流程

首先,SM3算法整体运算以32bit为单位进行,故定义32bit为一个字(字母X表示),一个消息分组(512bit)为16(512/32=16)个字。SM3算法中基本用到的运算符如下表:

符号含义
\wedge32bit 的与运算
\vee32bit 的或运算
\bigoplus32bit 的异或运算
+mod 2^{^{32}}bit 的算数加法运算
~~~\sim32bit 的非运算
<<<k32bit 循环左移 k bit运算
\leftarrow左向赋值

1. 初始值

IV=7380166f\; 4914b2b9\; 172442d7\; da8a0600\; a96f30bc\; 163138aa\; e38dee4d\; b0fb0e4e

上述每一位均为16进制(4bit),故按照8位划分为一个字,分别用ABCDEFGH表示。

2. 消息扩展

未扩展前,一个消息分组B^{i}是512bit(16个字)。需要将它扩展为132个字,一个字用W_{i}表示。

前16个字W_{0}W_{15},就是原消息分组B^{i}的16个字;

第17个字到第68个字W_{16}W_{67},按照如下运算:

W_{j}\leftarrow P_{1}(W_{j-16}\bigoplus W_{j-9}\bigoplus (W_{j-3}<<<15))\bigoplus (W_{j-13}<<<7)\bigoplus W_{j-6}

第69个字到第132个字W_{0}^{'}W_{63}^{'},按照如下运算:

W_{j}^{'}=W_{j}\bigoplus W_{j+4}

上式中,P_{1}()为置换函数,操作如下。其中,X表示一个字:

P_{1}(X)=X\bigoplus (X<<<15)\bigoplus (X<<<23)

P_{0}(X)=X\bigoplus (X<<<9)\bigoplus (X<<<17)

3. 压缩函数

令A,B,C,D,E,F,G,H分别为字寄存器(大端格式存储,big-endian),SS1,SS2,TT1,TT2为中间变量,使用压缩函数时有通式:

V^{i+1}=CF(V^{i},B^{i}),0\leq i\leq n-1

其具体计算过程如下:

ABCDEFGH\leftarrow V^{i}
FOR   j=0   TO   63
        SS1\leftarrow ((A<<<12)+E+(T_{j}<<<j))<<<7
        SS2\leftarrow SS1\bigoplus (A<<<12)
        TT1\leftarrow FF_{j}(A,B,C)+D+SS2+W_{j}^{'}
        TT2\leftarrow GG_{j}(E,F,G)+H+SS1+W_{j}
        D\leftarrow C
        C\leftarrow B<<<9
        B\leftarrow A
        A\leftarrow TT1
        H\leftarrow G
        G\leftarrow F<<<19
        F\leftarrow E
        E\leftarrow P_{0}(TT2)
ENDFOR
V^{i+1}\leftarrow ABCDEFGH\bigoplus V^{i}

相当于处理后的ABCDEFGH和原V^{i}异或得到新的V^{i+1}

上式中,T_{j}是常量,FF_{j}GG_{j}是布尔函数(以对字X、Y、Z操作示例):

T_{j}=\left\{\begin{matrix} 79cc4519\; \; 0\leq j\leq 15\\ 7a879d8a\; \; 16\leq j\leq 63\end{matrix}\right.

FF_{j}=\left\{\begin{matrix} X\bigoplus Y\bigoplus Z\; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; 0\leq j\leq 15\\ (X\wedge Y)\vee (X\wedge Z)\vee (Y\wedge Z)\; \; 16\leq j\leq 63\end{matrix}\right.

GG_{j}(X,Y,Z)=\left\{\begin{matrix} X\bigoplus Y\bigoplus Z\; \;\; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; 0\leq j\leq 15\\ (X\wedge Y)\vee (\sim X\wedge Z)\; \; 16\leq j\leq 63\end{matrix}\right.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值