SM3 密码杂凑算法 精要总结(GB_T 32905-2016)

算法概述

对长度为l(l < 2^{64})比特的消息m,SM3杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特。

1.填充

假设消息m 的长度为l 比特。首先将比特“1”添加到消息的末尾,再添加k 个“0”,k是满
足l + 1 + k ≡ 448mod512 的最小的非负整数。然后再添加一个64位比特串,该比特串是长度l的二进制表示。填充后的消息m′ 的比特长度为512的倍数
即:
M\_last\_block = msg\_last\_block || 1 || 00...000_{448-1-l位} || len(msg)_{64位}
如果 msg比特长度是24。则 M = msg || 1 || 00...00_{423位} || 00000000 00000018_{64位}
如果 msg比特长度是512。则 M = msg || 1 || 00...00_{447位} || 00000000 00000200_{64位}
如果 msg比特长度是1024。则 M = msg || 1 || 00...00_{447位} || 00000000 00000400_{64位}

填充示例

2.迭代压缩

V^{(i)} = CF( V^{(i-1)}, B^{(i)})
其中:

  • V^0 是固定IV,即 V^0 = IV =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e
  • B^{(i)} 是 消息分组(填充后的)
  • CF是压缩函数

3.生成256bit结果

*细节概念介绍

  • 固定IV
    IV =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e

消息扩展

将消息分组B(i)按以下方法扩展生成132个字用于压缩函数CF

132个字(1个字:32bit数据)

W_0W_1 · · · W_{15}

就是填充后的消息分组本身。

W_{16}W_1 · · · W_{67}


W’_0W‘_1 · · · W’_{63}


压缩函数:

令A,B,C,D,E,F,G,H为字寄存器,SS1,SS2,TT1,TT2为中间变量,压缩函数V^{i+1} = CF(V ^{(i)}, B^{(i)}), 0 ≤i ≤ n−1。计算过程描述如下:


V^{i+1}的更新 : 新的ABCDEFG异或上 当前的 V^i

最终的杂凑值是最后一个Vn

常量 T_j

Tj Value
T_{0\rightarrow15} 79cc4519
T_{16\rightarrow63} 7a879d8a

布尔函数 FF_j和 GG_j

置换函数 P_0 和 P_1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容