openssl hkdf

时间: 2024-03-15 21:40:34 浏览: 18
OpenSSL是一个开源的软件库,提供了一系列的密码学功能,包括对称加密、非对称加密、哈希函数等。而HKDF(HMAC-based Extract-and-Expand Key Derivation Function)是一种基于HMAC的密钥派生函数。 在OpenSSL中,可以使用HKDF来派生密钥。HKDF主要用于从一个长的共享密钥派生出多个不同的密钥,以供不同的应用使用。它通过两个步骤来实现密钥派生:提取(Extract)和扩展(Expand)。 提取步骤使用HMAC算法将输入的长密钥和一个盐值(salt)进行混合,生成一个伪随机密钥(pseudo-random key)。扩展步骤则使用该伪随机密钥和上下文信息(context info)生成最终的派生密钥。 使用OpenSSL进行HKDF密钥派生的具体步骤如下: 1. 创建一个HMAC上下文对象。 2. 设置HMAC上下文对象的哈希算法和盐值。 3. 使用HMAC上下文对象进行提取操作,得到伪随机密钥。 4. 使用伪随机密钥和上下文信息进行扩展操作,得到最终的派生密钥。
相关问题

openssl hkdf 例程

OpenSSL是一个开源的加密库,提供了各种密码学功能和算法的实现。其中,HKDF(HMAC-based Extract-and-Expand Key Derivation Function)是一种基于HMAC的密钥派生函数,用于从一个长的输入密钥派生出更短的密钥。 在OpenSSL中,可以使用以下步骤来执行HKDF: 1. 导入必要的头文件: ```c #include <openssl/evp.h> #include <openssl/kdf.h> ``` 2. 定义输入参数: ```c const EVP_MD *md = EVP_sha256(); // 使用SHA-256哈希算法 const unsigned char *salt = NULL; // 可选的盐值 size_t salt_len = 0; // 盐值长度 const unsigned char *ikm = ...; // 输入密钥材料 size_t ikm_len = ...; // 输入密钥材料长度 const unsigned char *info = ...; // 可选的上下文信息 size_t info_len = ...; // 上下文信息长度 unsigned char *okm = ...; // 输出密钥材料 size_t okm_len = ...; // 输出密钥材料长度 ``` 3. 执行HKDF派生函数: ```c int result = HKDF(md, salt, salt_len, ikm, ikm_len, info, info_len, okm, okm_len); ``` 其中,`md`参数指定了哈希算法,`salt`参数是可选的盐值,`ikm`参数是输入密钥材料,`info`参数是可选的上下文信息,`okm`参数是输出密钥材料。 4. 检查派生结果: ```c if (result != 1) { // 派生失败 // 处理错误 } else { // 派生成功 // 使用输出密钥材料 } ``` 这是一个简单的示例,你可以根据具体的需求和情况进行参数的设置和处理。

openssl hkdf 实现例程

OpenSSL是一个开源的加密库,提供了丰富的密码学功能。其中,HKDF(HMAC-based Extract-and-Expand Key Derivation Function)是一种密钥派生函数,用于从一个长的输入派生出一个或多个密钥。 下面是一个使用OpenSSL库实现HKDF的例程: ```c #include <openssl/evp.h> #include <openssl/hmac.h> void hkdf(const unsigned char *salt, int salt_len, const unsigned char *ikm, int ikm_len, const unsigned char *info, int info_len, unsigned char *okm, int okm_len) { unsigned char prk[EVP_MAX_MD_SIZE]; unsigned char t[EVP_MAX_MD_SIZE]; unsigned char *p = okm; int n = 0; int t_len = 0; int i = 1; // Step 1: Extract HMAC(EVP_sha256(), salt, salt_len, ikm, ikm_len, prk, NULL); // Step 2: Expand while (n < okm_len) { HMAC_CTX *ctx = HMAC_CTX_new(); HMAC_Init_ex(ctx, prk, EVP_MD_size(EVP_sha256()), EVP_sha256(), NULL); HMAC_Update(ctx, t, t_len); HMAC_Update(ctx, info, info_len); HMAC_Update(ctx, &i, sizeof(i)); HMAC_Final(ctx, t, NULL); HMAC_CTX_free(ctx); memcpy(p, t, (okm_len - n) > EVP_MD_size(EVP_sha256()) ? EVP_MD_size(EVP_sha256()) : (okm_len - n)); n += EVP_MD_size(EVP_sha256()); i++; } } int main() { unsigned char salt[] = "salt"; int salt_len = sizeof(salt) - 1; unsigned char ikm[] = "input key material"; int ikm_len = sizeof(ikm) - 1; unsigned char info[] = "info"; int info_len = sizeof(info) - 1; unsigned char okm[32]; int okm_len = sizeof(okm); hkdf(salt, salt_len, ikm, ikm_len, info, info_len, okm, okm_len); // 输出派生的密钥 for (int i = 0; i < okm_len; i++) { printf("%02x", okm[i]); } printf("\n"); return 0; } ``` 这个例程使用了OpenSSL库中的HMAC函数来实现HKDF。它接受输入的盐值(salt)、输入密钥材料(ikm)、上下文信息(info),并输出派生的密钥(okm)。

相关推荐

最新推荐

recommend-type

openssl详细使用教程

在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
recommend-type

openssl数据加解密及证书使用例子

最近在做IOT项目,使用...4:通过一个例子,演示通过openssl创建root,server, client及验证 通过该文档,对密匙,证书之间的关系有一个很好的理解。同时对openssl工具有一个初步认识。文档的所有命令都是测试通过的。
recommend-type

Windows安装配置C/C++(VS2017)OpenSSL开发环境配置教程

主要为大家详细介绍了Windows安装配置C/C++,OpenSSL开发环境配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C语言使用openSSL库AES模块实现加密功能详解

主要介绍了C语言使用openSSL库AES模块实现加密功能,详细分析了C语言加密的相关概念、原理及AES模块加密具体实现技巧,需要的朋友可以参考下
recommend-type

openssl api 编程

openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。