openssl使用的密钥协商(或密钥推导)功能是什么?

What is the key agreement (or key derivation) function used by openssl?

我正在尝试将 openssl 代码替换为 CNG winapi 代码。下面是我拥有的准系统 openssl 代码。

const char *generator = ""; // 256 character hex string
const char *prime     = ""; // 256 character hex string

dh = DH_new();

// Initialize dh's generator and prime
BN_hex2bn(&(dh->g), generator);
BN_hex2bn(&(dh->p), prime);

// Generate public and private keys
DH_generate_key(dh);

// Extract server's public key from init_msg's 'key'
BIGNUM *server_pub_key = BN_new();
BN_hex2bn(&server_pub_key, " *** 256 character server public key as hex string ***");

// Use DH to calculate the shared key
vector<unsigned char> shared_key;
shared_key.resize(DH_size(dh));
err = DH_compute_key(shared_key.data(), server_pub_key, dh);

以上代码生成了一个256个字符的十六进制字符串(128字节)的共享密钥。 openssl 用来创建此类密钥的密钥协议函数是什么。 提前致谢。

在使用任何 KDF 之前,您得到的只是 Diffie-Hellman (DH) 密钥协议的直接结果。除此之外,我不确定您希望我们说些什么。它是一个无符号的大端数字,范围最大为密钥大小(1024 位),以字节(128 字节)为单位。

那当然是 BCRYPT_DH_ALGORITHM

没有。或者"the NULL KDF",或者f(x) -> x.

DH_compute_key 执行原始 DH 操作,return 得到结果。

None 记录的 KDF 值到 BCryptDeriveKey return 原始值。他们总是有可能添加了 BCRYPT_KDF 尚未进入文档的值,您需要从最新的 SDK 版本中检查 bcrypt.h