NIST SP 800-108笔记
摘要:本文档对NIST SP 800-108介绍的密钥导出函数KDF进行简要分析记录,文档记录了三种类型的密钥导出函数,分别是基于计数器模式的KDF、基于反馈模式的KDF、基于双线叠加的KDF(前两种模式的组合)。KDF中采用的伪随机函数PRF可以采用HMAC或者CMAC。
关键词:密钥、密钥导出、密钥导出函数、HMAC、CMAC、分组密码算法、杂凑算法。
目录
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)
功能:基于计数器模式的密钥导出函数
输入参数:
- KI:KDF所需的输入密钥,被作为HMAC或CMAC的密钥。
- Lable:标签,比特串,比如可表示KDF的用途。
- Context:上下文,比如可以是执行KDF的人和/或使用导出密钥的人。
- L:导出密钥的比特长度。
内部参数:
- PRF:伪随机函数,可选用HMAC或者CMAC。
- h:PRF函数的输出长度。
- r:计数器i的二进制表示长度,不超过32,须固定。
返回数据:
- KO:导出密钥。
执行步骤:
步骤1:。
步骤2:若n>2exp(r)-1,返回错误标识。
步骤3:[无用,可删除]。
步骤4:for 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比特)。
备注:
- [i]2是将计数器i表示为比特串,其长度为r(见内部参数)。
- [L]2是将导出密钥KO的比特长度L表示为比特串,其长度算法中未规定,而由应用层编码方案来定。
- 由于[i]2的长度r<=32,h(PRF函数的输出长度)通常不超过216比特,因此[L]2的长度r<=48。
图1 基于计数器模式的密钥导出函数的执行流程图
5.2 基于反馈模式的KDF
函数:KO = KDF_Feedback(KI, Lable, Context, L).
功能:基于反馈模式的密钥导出函数
输入参数:
- KI:KDF所需的输入密钥,被作为HMAC或CMAC的密钥。
- Lable:标签,比特串,比如可表示KDF的用途。
- Context:上下文,比如可以是执行KDF的人和/或使用导出密钥的人。
- L:导出密钥的比特长度。
- IV:初始化向量,任意长度,可为空串。
内部参数:
- PRF:伪随机函数,可选用HMAC或者CMAC。
- h:PRF函数的输出长度。
- r:计数器i的二进制表示长度,不超过32,须固定。
返回数据:
- KO:导出密钥。
执行步骤:
步骤1:。
步骤2:若n>2exp(32)-1,返回错误标识。
步骤3:K(0) = IV。
步骤4:for 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比特)。
备注:
- {|| [i]2} 表示可以将[i]2和其它数据串联在一起,也可以不串联它。
- [i]2是将计数器i表示为比特串,其长度为r(见内部参数)。
- [L]2是将导出密钥KO的比特长度L表示为比特串,其长度算法中未规定,而由应用层编码方案来定。
- 由于[i]2的长度r<=32,h(PRF函数的输出长度)通常不超过216比特,因此[L]2的长度r<=48。
图2 基于反馈模式的密钥导出函数的执行流程图
5.3 基于双线叠加的KDF(前两种模式的组合)
函数:KO = KDF_Double_Pipeline(KI, Lable, Context, L).
功能:基于双线叠加的模式的密钥导出函数
输入参数:
- KI:KDF所需的输入密钥,被作为HMAC或CMAC的密钥。
- Lable:标签,比特串,比如可表示KDF的用途。
- Context:上下文,比如可以是执行KDF的人和/或使用导出密钥的人。
- L:导出密钥的比特长度。
- IV:初始化向量,任意长度,可为空串。
内部参数:
- PRF:伪随机函数,可选用HMAC或者CMAC。
- h:PRF函数的输出长度。
- r:计数器i的二进制表示长度,不超过32,须固定。
返回数据:
- KO:导出密钥。
执行步骤:
步骤1:。
步骤2:若n>2exp(32)-1,返回错误标识。
步骤3:[无用,可删除]。
步骤4:A(0) = IV= Lable || 0x00 || Context || [L]2。
步骤5:for 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比特)。
备注:
- {|| [i]2}表示可以将[i]2和其它数据串联在一起,也可以不串联它。
- [i]2是将计数器i表示为比特串,其长度为r(见内部参数)。
- [L]2是将导出密钥KO的比特长度L表示为比特串,其长度算法中未规定,而由应用层编码方案来定。
- 由于[i]2的长度r<=32,h(PRF函数的输出长度)通常不超过216比特,因此[L]2的长度r<=48。
图3 基于双线模式的密钥导出函数的执行流程图