HKDF是一种特定的键衍生函数(KDF),即初始键控材料的功能,KDF从其中派生出一个或多个密码强大的密钥。在此我们想要描述的是基于HMAC的HKDF。

1HKDF概述

密钥派生函数(KDF)是密码系统的基本组成部分。它的目标是获取一些初始的密钥材料,并从中派生出一个或多个安全强度很大的密钥。

我们将要介绍的是基于HMAC的KDF,称之为HKDF,它可以应用于各种协议和应用程序的构建。HKDF在逻辑上由两个部分组成。第一个部分采用输入密钥材料和“提取”,它是一个固定长度的伪随机密钥K。第二部分则将密钥扩展为几个随机密钥,并以我们需要的长度输出。

在许多应用程序中,输入的密钥材料不一定是均匀分布的,而且攻击者可能对它有一定的了解,甚至可以部分控制它。因此,“提取”阶段的目标是将输入密钥材料的可能分散的熵“集中”到一个短的,但强度高的伪随机密钥。在某些应用程序中,输入可能已经是一个好的伪随机密钥;在这些情况下,“提取”部分是不必要的,“扩展”部分可以单独使用。

第二阶段“扩展”伪随机密钥到所需的长度;输出密钥的数量和长度取决于所需密钥的具体加密算法。

2、算法描述

HKDF就是利用实例化了的哈希函数的HMAC来实现密钥生成。HMAC有两个必要的参数:第一个是密钥,第二个是输入(或消息)。当消息由几个元素组成时,我们在第二个参数中使用串联(表示|);例如,HMAC(K, elem1|elem2|elem3)。

一般来说,HKDF算法所做的工作分为2步,其一称之为提取;其二称之为扩展。接下来我们说明这两步。

(1)、提取

所谓提取就是将用户输入的密钥尽量的伪随机化。一般是使用一个哈希函数来实现,具体那种更具需要在HMAC中确定。这一过程可以表示如下:

HKDF-Extract(salt, IKM)得到PRK,而PRK的计算公式如下:

PRK = HMAC-Hash(salt, IKM) ,这其中有2个输入和1个输出,

Salt,输入,加盐操作的盐,如果不提供则全部初始化为0的字符串,长度则为所采用哈希函数的散列值长度。

IKM,输入,数额udemiyao材料。

PRK,输出,伪随机化后的密钥,长度则为所采用哈希函数的散列值长度。

需要注意的是,在这一步中“IKM”被用作HMAC输入,而不是HMAC密钥。

(2)、扩展

所谓扩展,其实就是通过一系列的哈希运算将密钥扩展到我们需要的长度。这个长度我们记为L。这一过程标识如下:

HKDF-Expand(PRK, info, L) -> OKM,其中有3个输入量和1个输出量,其中:

PRK,输入,一般是在提取阶段得到的输出,是一个伪随机的密钥,长度不小于所采用的哈希算法的输出摘要长度。

Info,输入,可选上下文和应用程序特定信息(可以是零长度字符串)

L,输入,以字节计算的密钥原料的长度,一般不长于哈希函数输出摘要长度的255倍。

OKM,输出,长度为L的密钥材料输出,其计算方式如下:

计算一系列的哈希值,我们记为T(n),其中n为0-255的整数,具体取值由所计算的长度L来确定。n的最大值为:L除以所用哈希函数输出摘要的长度,再向上取整,我们将其记为N。

T(0) = 长度为0的空字符串

T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)

T(2) = HMAC-Hash(PRK, T(1) | info | 0x02)

T(3) = HMAC-Hash(PRK, T(2) | info | 0x03)

直到T(N)为止,需要注意的是,每个哈希操作都会串接一个字节的常量,从1到N,所以最大的N值只能到255。然后将计算得到的这些T(n)串接起来,我们记为T,即:

T = T(1) | T(2) | T(3) | ... | T(N)

而我们想要获得的OKM正是取T的前L个字节组成。这要我们就得到了我们想要的密钥材料。

3、代码实现

上面我们已经描述了HKDF的实现过程,接下来我们将实现这一过程。首先,我们任然是定义一个上下文结构。

/** 该结构将为HKDF的提取-扩展秘钥派生函数提供上下文信息*/

typedef struct HKDFContext {

int whichSha;

HMACContext hmacContext;

int hashSize;

unsigned char prk[SHAMaxHashSize];

int Computed;

int Corrupted;

} HKDFContext;

接着我们实现HDKF的抽取函数,该函数的实现如下:

int hkdfExtract(SHAversion whichSha,

const unsigned char *salt, int salt_len,

const unsigned char *ikm, int ikm_len,

uint8_t prk[SHAMaxHashSize])

{

unsigned char nullSalt[SHAMaxHashSize];

if (salt == 0)

{

salt = nullSalt;

salt_len = SHAHashSize(whichSha);

memset(nullSalt,'\0',salt_len);

}

else if (salt_len < 0)

{

return shaBadParam;

}

return hmac(whichSha, ikm, ikm_len, salt, salt_len, prk);

}

还需要实现HKDF扩展函数,该函数的实现如下:

int hkdfExpand(SHAversion whichSha, const uint8_t prk[ ], int prk_len,

const unsigned char *info, int info_len,

uint8_t okm[ ], int okm_len)

{

int hash_len, N;

unsigned char T[SHAMaxHashSize];

int Tlen, where, i;

if (info == 0)

{

info = (const unsigned char *)"";

info_len = 0;

}

else if (info_len < 0)

{

return shaBadParam;

}

if (okm_len <= 0) return shaBadParam;

if (!okm) return shaBadParam;

hash_len = SHAHashSize(whichSha);

if (prk_len < hash_len) return shaBadParam;

N = okm_len / hash_len;

if ((okm_len % hash_len) != 0) N++;

if (N > 255) return shaBadParam;

Tlen = 0;

where = 0;

for (i = 1; i <= N; i++)

{

HMACContext context;

unsigned char c = i;

int ret = hmacReset(&context, whichSha, prk, prk_len) ||

hmacInput(&context, T, Tlen) ||

hmacInput(&context, info, info_len) ||

hmacInput(&context, &c, 1) ||

hmacResult(&context, T);

if (ret != shaSuccess) return ret;

memcpy(okm + where, T,(i != N) ? hash_len : (okm_len - where));

where += hash_len;

Tlen = hash_len;

}

return shaSuccess;

}

至此我们就实现了HKDF的全部功能。

4、结果

前面我们已经实现了HKDF,我们还需要对其进行验证,我们采用SHA-256哈希函数,分别生成40位和80为的密钥。

40位密钥:

80位密钥:

很明显,40位的密钥和80位的密钥前40位都是相同的。

欢迎关注:

转载于:https://www.cnblogs.com/foxclever/p/8642865.html

信息摘要算法之六:HKDF算法分析与实现相关推荐

  1. 信息摘要算法:HMAC算法分析

    1.HMAC概述 HMAC算法首先它是基于信息摘要算法的.目前主要集合了MD和SHA两大系列消息摘要算法.其中MD系列的算法有HmacMD2.HmacMD4.HmacMD5三种算法:SHA系列的算法有 ...

  2. 信息摘要算法之一:MD5算法解析及实现

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...

  3. 分布式服务器框架之Servers.Core库实现 DES对称加密算法;SHA1信息摘要算法;MD5信息摘要算法

    1 介绍 1.1 DES对称加密算法介绍 对称加密算法 通信双方(通信主体)同时掌握一个钥匙,加解密都由这一个钥匙完成.通信双方通信前共同拟定一个密钥,不向第三方公开,发送前加密和接受后解密都由此密钥 ...

  4. 密码学 MD5信息摘要算法

    一.简介 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确 ...

  5. 加密解密、信息摘要算法收集

    MD5算法研究 综述 md5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer science和rsa ...

  6. MD5信息摘要算法详解

    MD5信息摘要算法详解 文章目录 MD5信息摘要算法详解 01 MD5概要 02 MD5特性 03 MD5应用 04 MD5实现算法 05 MD5在线网站 01 MD5概要 MD5信息摘要算法,一种被 ...

  7. 简述MD5信息摘要算法

    在之前的文章中,我们聊了不少的加密算法,今天我们聊一种被广泛使用的密码散列函数--MD5. MD5又叫MD5信息摘要算法,经常用于确保信息传输的完整性和一致性 .从严格意义上来说,MD5并不是加密算法 ...

  8. 信息摘要算法之四:SHA512算法分析与实现

    前面一篇中我们分析了SHA256的原理,并且实现了该算法,在这一篇中我们将进一步分析SHA512并实现之. 1.SHA简述 尽管在前面的篇章中我们介绍过SHA算法,但出于阐述的完整性我依然要简单的说明 ...

  9. 信息摘要算法之三:SHA256算法分析与实现

    前面一篇中我们分析了SHA的原理,并且以SHA1为例实现了相关的算法,在这一片中我们将进一步分析SHA2并实现之. 1.SHA简述 前面的篇章中我们已经说明过,SHA实际包括有一系列算法,分别是SHA ...

最新文章

  1. jsp与java的关系_jsp教程中:jsp与servlet的区别和关系
  2. 【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图设置自适应屏幕...
  3. MySQL编程技巧_PHP与MySQL开发的8个技巧小结
  4. [BZOJ1385][Baltic2000]Division expression
  5. 华为usg6000配置手册_带你了解防火墙安全区域的作用及简单的配置,小白不要错过了...
  6. 正则表达式和grep
  7. pptx字体类的相关方法
  8. 清华大学登顶亚洲第一:2019泰晤士高等教育世界大学排名发布
  9. java读取rar_java怎么读取Zip和RAR里面的文件啊?
  10. 用ROS来做无人测试平台系列之国外的一些RACECAR
  11. 期末作业实验报告:MLP实验对比(MLPClassifier)
  12. ADC中PPM rms dBFS
  13. 区块链技术:未来将颠覆的9大行业
  14. http://sishuok.com/forum/blog/index.html?search_keywords=%E7%A0%94%E7%A3%A8%E8%AE%BE%E8%AE%A1%E6%A8%
  15. ctf MISC 简单套娃
  16. 织梦后台内容模型使用教程
  17. 基于AD Event日志检测LSASS凭证窃取攻击
  18. 如何使用ABBYY FineReader 14编辑文本
  19. java匿名类构造方法_Android(Java) | 你知道吗?Java匿名内部类其实是有“名字”和构造方法的!...
  20. 答辩提问问题php代码,答辩会问到什么问题

热门文章

  1. MacBook风扇响是因为这些需要注意
  2. 绝地求生2021服务器维护什么时候,绝地求生最新维护公告2021 吃鸡5.18维护更新到几点结束...
  3. mysql 二次方函数_MySQL函数集锦
  4. 乘数科技云管控平台适配阿里云 PolarDB,共促云原生数据库生态繁荣
  5. 学校信息化分享-中小学怎样快速完成教学资源库的建设
  6. 《Visual C++ 开发从入门到精通》——2.6 数据类型
  7. 勤能补拙,拙有何用?
  8. 在计算机主机与外部输入输出,计算机的外部设备包括输入设备和输出设备和什么?...
  9. python3爬取音乐(python经典编程案例)
  10. vslam入门到入土:dissertation 填坑