openssl hkdf 实现例程
时间: 2024-03-15 14:40:34 浏览: 14
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)。