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有两个:

5 密钥导出函数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:导出密钥。

执行步骤:

步骤1

步骤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:

步骤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:

步骤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 基于双线模式的密钥导出函数的执行流程图

NIST SP 800-108密钥导出函数KDF研究相关推荐

  1. C语言KDF密钥源代码,区块链中的数学-SM2算法与KDF密钥导出函数

    本节讲了SM2算法的KDF函数,从一般用途到SM2特定实现 ## 写在前面 上一节说了[sm2概述和加密过程](https://learnblockchain.cn/article/1516)实现, ...

  2. SM2使用的密钥导出函数

    SM2中使用了一种KDF,可以参见SM2标准文档第4部分公钥加密算法的5.4.3节密钥派生函数. 函数:K = KDF (Z, klen) 功能:SM2使用的的密钥导出函数 输入参数: Z:KDF所需 ...

  3. SM9使用的密钥导出函数

    SM9使用的密钥导出函数是H1和H2函数的前四步,详情参见在第2部分 数字签名算法 5.4.2节密码杂凑函数. 两个密钥导出函数的差异在SM3杂凑时的首字节不同,H1和H2分别使用0x01和0x02作 ...

  4. 国密SM2算法密钥派生函数KDF的实现

    前段时间需要实现国密算法SM2的签名.验签.加密.解密等功能,加解密过程使用到的密钥派生函数(KDF),从网上搜到的代码不符合<GMT 0003.4-2012 SM2椭圆曲线公钥密码算法 > ...

  5. 基于国密SM3算法(openssl接口)密钥派生函数KDF的实现

    前言 最近项目需要使用KDF生成秘钥,对比国密标准(GB_T 32918.4-2016)及网络资料,发现确实没有让我满意的, 自己结合标准和大佬:Heidlyn的帖子<国密SM2算法密钥派生函数 ...

  6. MAC 与密钥派生函数 KDF

    一.MAC 消息认证码 MAC 消息认证码,即 Message Authentication Code,是用于验证消息的一小段信息. 换句话说,能用它确认消息的真实性--消息来自指定的发件人并且没有被 ...

  7. NIST SP 800-132基于口令的密钥生成函数PBKDF和主密钥保护数据的方法研究

      摘要:本文档对NIST SP 800-132介绍的基于口令的密钥生成函数PBKDF进行简要分析记录,基于口令的密钥生成函数即将口令(Password)通过密钥导出函数KDF后生成主密钥.同时描述了 ...

  8. HMAC和密钥导出(HMAC and Key Derivation)

    简单地计算hash_func(key+msg)以获得MAC(消息认证码)被认为是不安全的.建议改用HMAC算法,例如HMAC-SHA256或HMAC-SHA3-512或其他安全MAC算法. 什么是HM ...

  9. dll 导出函数 下划线_内核中的代码完整性:深入分析ci.dll

    前言 在某些场景中,如果我们希望在允许某个进程进行特定动作前,以一种可靠的方式确认该进程是否可信,那么验证该进程的Authenticode签名是一个不错的方式.用户模式下的DLL wintrust提供 ...

  10. NIST:生成安全密码密钥

    NIST:生成安全密码密钥 https://ws680.nist.gov/publication/get_pdf.cfm?pub_id=913043 ITL BULLETIN FOR DECEMBER ...

最新文章

  1. Hibernate 关联映射 之 多对多 关联(一)
  2. 修改tomcat端口号的方法:
  3. 鸿蒙台湾乌龙茶,郭碧婷生女再闹乌龙?向太守口如瓶,向佐有意回避,其实另有隐情...
  4. c语言单词翻译大全,c语言单词翻译
  5. C++ Primer 5th笔记(chap 14 重载运算和类型转换)算术和关系运算符
  6. 基于事件驱动架构构建微服务第7部分:在仓储上实现事件溯源
  7. 获取当前jvm的进程号
  8. 12306一直提示网络有问题_春运10日拉开大幕 买票遇到问题?别慌!这里有答案...
  9. python条形堆积图_python – 带有中心标签的堆积条形图
  10. org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont.addNewFamily()
  11. 尚硅谷周阳老师2020最新Springcloud完整版学习
  12. Exchange 2013管理员账号登录ecp登陆不了
  13. 什么是BI、数据仓库、数据湖和数据中台,他们有什么差异?
  14. 2022-08-22 第六小组 瞒春 学习笔记
  15. 【20220504】软件开发模式
  16. wsl1升级到 wsl2 后高cpu占用解决方案
  17. RISC-V技术杂谈
  18. appium - X5内核应用
  19. mysql 解决全角半角 问题
  20. java mp4 切片_视频完美切片存储方案 附自动化处理脚本

热门文章

  1. Python编程学习笔记 - 下载数据进行可视化(I)
  2. 怎么把台式电脑的大量数据快速迁移到笔记本
  3. 前端如何修改网页的标题栏图标和名称
  4. Pycharm配置(1)——解释器(interpreter)
  5. 为大家介绍两款私藏宝藏可视化大屏制作软件
  6. LIS3DH 三轴加速度传感器使用流程及示例
  7. 天堂2启动mysql就没了_单机天堂2运行不了 求助
  8. 系统架构设计方法论——TOGAF
  9. 计算机网络的地址三类,计算机网络中有几种地址格式
  10. 关于RS-485总线,这篇很详细