SM9使用的密钥导出函数是H1和H2函数的前四步,详情参见在第2部分 数字签名算法 5.4.2节密码杂凑函数。
两个密钥导出函数的差异在SM3杂凑时的首字节不同,H1和H2分别使用0x01和0x02作为首字节。以下记H1和H2函数对应的密钥导出函数为KDF1和KDF2
函数:K = KDF1 (Z, klen) 和 K = KDF2 (Z, klen)
功能:SM9使用的的密钥导出函数
输入参数:
- Z:KDF所需的数据。
- klen:导出密钥的比特长度。
内部参数:
- HASH:伪随机函数,这里选中SM3。
- hlen:HASH函数的输出长度,即SM3输出长度256比特。
- int(i):计数器i的32比特大端表示。
返回数据:
- K:导出密钥。
执行步骤:
步骤1: 。
步骤2:若n>2exp(32)-1,返回错误标识。
步骤3:一个字节tag的取值为:KDF1中tag=0x01,KDF2中tag=0x02。
步骤3:for i = 1,2,..., n
K(i) = HASH (tag || Z || int(i))
步骤4:返回K = MSB(K(1) || K(2) || ... || K(n), klen)。(取串的最左边kLen比特)。
图 SM9使用的KDF的执行流程图