国密杂凑算法SM3

21 篇文章 1 订阅
12 篇文章 3 订阅

转自 http://blog.csdn.net/lkiller_hust/article/details/51344828

0. 引言

SM3杂凑算法是中国国家密码局公布的hash算法商用标准,能应用于数字签名与验证、消息认证码的生成以及伪随机数的生成。

1. 常数与函数

1.1 初始值

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

1.2 常量

Tj={ 79cc4519    0≤j≤15;7a879d8a    16≤j≤63}

1.3 布尔函数

FFj(X,Y,Z)={X^Y^Z  0≤j≤15;(X & Y)|(X&Z)|(Y&Z) 16≤j≤63}

GGj(X,Y,Z)={X^Y^Z  0≤j≤15;(X & Y)|(~X&Z)16≤j≤63}

X,Y,Z为字(32bit)

1.4 置换函数

P0(X)= X^(X<<<9)^(X<<<17)

P1(X)= X^(X<<<15)^(X<<<23)

X 为字

2. 算法简介

SM3算法能够对长度为l(l<2^64)bit的消息m,进行填充和迭代压缩,生成杂凑值,最终的杂凑值为256bit。

2.1 填充过程

设消息m的长度为l bit,首先将bit"1"添加到消息末尾,再加k个“0”,k是满足l+1+k =448 mod 512的最小非负整数。然后再添加一个64bit串,该串是l的二进制表示,填充后的消息m'长度为512的整数倍。

2.2 迭代压缩

迭代过程:

m'按照512bit进行分组:m'=B(0)B(1)...B(n-1)

n=(l+k+65)/512.

迭代过程如下:

FOR i=0 to n-1

  V(i+1) = CF(V(i),B(i)

ENDFOR

CF为压缩函数,V(0)为初始值IV,迭代压缩的结果为V(n)

消息扩展:

消息分组B(i)扩展生成132个字W0,W1,...W67,W0',W1'...W63'。

a)消息分组B(i)划分为16个字W0,W1,...W15.

b)FOR j=16 to 67

  Wj=P1(Wj-16 ^ Wj-9 ^ (Wj-3 <<<15)^(Wj-13<<<7)^Wj-6

   ENDFOR

c)FOR j=0 to 63

  Wj'=Wj^Wj+4

   ENDFOR

压缩函数:

A/B/C/D/E/F/G/H为字寄存器,SS1/SS2/TT1/TT2为中间变量,压缩函数V(i+1) = CF(V(i),B(i))计算过程如下:

ABCDEFGH = V(i)

FOR j=0 to 63

  SS1 = ((A<<<12)+E+(Tj<<<j))<<<7

  SS2 = SS1^(A<<<12)

  TT1 = FFj(A,B,C)+D+SS2+Wj'

  TT2 = GGj(E,F,G)+H+SS1+Wj

  D = C

  C = B<<<9

  B = A

  A = TT1

  H = G

  G = F<<<19

  F = E

  E = P0(TT2)

ENDFOR

V(i+1) = ABCDEFGH^V(i)

运算过程中,字按照大端格式存储。

2.3 杂凑结果

杂凑结果为256bit值y=ABCDEFGH=V(n)


SM3算法描述
对长度为l(l< 2^64) 比特的消息m,SM3杂凑算法经过填充和 迭代压缩,生成杂凑值,杂凑值长度为256比特。
假设消息m 的长度为l 比特。首先将比特“1”添加到消息的末尾,再添加k 个“0”,k是满足l + 1 + k 448mod512 的最小的非负整数。然后再添加一个64位比特串,该比特串是长度l的二进制表示。
填充后的消息m′ 的比特长度为512的倍数。
例如:对消息01100001 01100010 01100011,其长度l=24,经填充得到比特串:
01100001 01100010 01100011 1 00...00(423比特) 00...011000(64比特l的二进制表示)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值