NIST SP 800-108密钥导出函数KDF研究

NIST SP 800-108笔记 

 

摘要:本文档对NIST SP 800-108介绍的密钥导出函数KDF进行简要分析记录,文档记录了三种类型的密钥导出函数,分别是基于计数器模式的KDF、基于反馈模式的KDF、基于双线叠加的KDF(前两种模式的组合)。KDF中采用的伪随机函数PRF可以采用HMAC或者CMAC。

 

关键词:密钥、密钥导出、密钥导出函数、HMAC、CMAC、分组密码算法、杂凑算法。

目录

4 伪随机函数PRF. 1

5 密钥导出函数KDF. 2

5.1 基于计数器模式的KDF. 2

5.2 基于反馈模式的KDF. 3

5.3 基于双线叠加的KDF(前两种模式的组合)... 5

 

 

4 伪随机函数PRF

推荐使用的伪随机函数PRF有两个:

  • HMAC(参见FIPS 198-1)
  • CMAC(参见NIST SP 800-38B)。

 

 

5 密钥导出函数KDF

描述了三种方案:

  • 基于计数器模式的KDF
  • 基于反馈模式的KDF
  • 基于双线叠加的KDF(前两种模式的组合)

5.1 基于计数器模式的KDF

函数:KO = KDF_Counter(KI, Lable, Context, L)

功能:基于计数器模式的密钥导出函数

输入参数:

  1. KI:KDF所需的输入密钥,被作为HMAC或CMAC的密钥。
  2. Lable:标签,比特串,比如可表示KDF的用途。
  3. Context:上下文,比如可以是执行KDF的人和/或使用导出密钥的人。
  4. L:导出密钥的比特长度。

内部参数:

  1. PRF:伪随机函数,可选用HMAC或者CMAC。
  2. h:PRF函数的输出长度。
  3. r:计数器i的二进制表示长度,不超过32,须固定。

返回数据:

  1. KO:导出密钥。

执行步骤:

步骤1n=\left \lceil L/h\right \rceil

步骤2n>2exp(r)-1,返回错误标识。

步骤3[无用,可删除]。

步骤4for i = 1,2,..., n

                  K(i) = PRF(KI, [i]2 || Lable || 0x00 || Context || [L]2)

步骤5返回KO = MSB(K(1) || K(2) || ... || K(n), L)。(取串的最左边kLen比特)。

备注:

  1. [i]2是将计数器i表示为比特串,其长度为r(见内部参数)。
  2. [L]2是将导出密钥KO的比特长度L表示为比特串,其长度算法中未规定,而由应用层编码方案来定。
  3. 由于[i]2的长度r<=32,h(PRF函数的输出长度)通常不超过216比特,因此[L]2的长度r<=48。

 

图1 基于计数器模式的密钥导出函数的执行流程图

5.2 基于反馈模式的KDF

函数:KO = KDF_Feedback(KI, Lable, Context, L).

功能:基于反馈模式的密钥导出函数

输入参数:

  1. KI:KDF所需的输入密钥,被作为HMAC或CMAC的密钥。
  2. Lable:标签,比特串,比如可表示KDF的用途。
  3. Context:上下文,比如可以是执行KDF的人和/或使用导出密钥的人。
  4. L:导出密钥的比特长度。
  5. IV:初始化向量,任意长度,可为空串。

内部参数:

  1. PRF:伪随机函数,可选用HMAC或者CMAC。
  2. h:PRF函数的输出长度。
  3. r:计数器i的二进制表示长度,不超过32,须固定。

返回数据:

  1. KO:导出密钥。

执行步骤:

步骤1:n=\left \lceil L/h\right \rceil

步骤2n>2exp(32)-1,返回错误标识。

步骤3K(0) = IV

步骤4for i = 1,2,..., n

                  K(i) = PRF(KI, K(i-1) {|| [i]2} || Lable || 0x00 || Context || [L]2)

步骤5返回KO = MSB(K(1) || K(2) || ... || K(n), L)。(取串的最左边kLen比特)。

备注:

  1. {|| [i]2} 表示可以将[i]2和其它数据串联在一起,也可以不串联它。
  2. [i]2是将计数器i表示为比特串,其长度为r(见内部参数)。
  3. [L]2是将导出密钥KO的比特长度L表示为比特串,其长度算法中未规定,而由应用层编码方案来定。
  4. 由于[i]2的长度r<=32,h(PRF函数的输出长度)通常不超过216比特,因此[L]2的长度r<=48。

图2 基于反馈模式的密钥导出函数的执行流程图

5.3 基于双线叠加的KDF(前两种模式的组合)

函数:KO = KDF_Double_Pipeline(KI, Lable, Context, L).

功能:基于双线叠加的模式的密钥导出函数

输入参数:

  1. KI:KDF所需的输入密钥,被作为HMAC或CMAC的密钥。
  2. Lable:标签,比特串,比如可表示KDF的用途。
  3. Context:上下文,比如可以是执行KDF的人和/或使用导出密钥的人。
  4. L:导出密钥的比特长度。
  5. IV:初始化向量,任意长度,可为空串。

内部参数:

  1. PRF:伪随机函数,可选用HMAC或者CMAC。
  2. h:PRF函数的输出长度。
  3. r:计数器i的二进制表示长度,不超过32,须固定。

返回数据:

  1. KO:导出密钥。

执行步骤:

步骤1:n=\left \lceil L/h\right \rceil

步骤2n>2exp(32)-1,返回错误标识。

步骤3[无用,可删除]。

步骤4A(0) = IV= Lable || 0x00 || Context || [L]2。

步骤5for i = 1,2,..., n

            5.1  A(i) = PRF(KI, A(i-1)) ;

            5.2  K(i) = PRF(KI, A(i) {|| [i]2} || Lable || 0x00 || Context || [L]2) ;

步骤6返回KO = MSB(K(1) || K(2) || ... || K(n), L)。(取串的最左边kLen比特)。

备注:

  1. {|| [i]2}表示可以将[i]2和其它数据串联在一起,也可以不串联它。
  2. [i]2是将计数器i表示为比特串,其长度为r(见内部参数)。
  3. [L]2是将导出密钥KO的比特长度L表示为比特串,其长度算法中未规定,而由应用层编码方案来定。
  4. 由于[i]2的长度r<=32,h(PRF函数的输出长度)通常不超过216比特,因此[L]2的长度r<=48。

图3 基于双线模式的密钥导出函数的执行流程图

 

猜你喜欢

转载自blog.csdn.net/samsho2/article/details/83592439