openssl使用的密钥协议(或密钥派生)函数是什么?

openssl使用的密钥协议(或密钥派生)函数是什么?,openssl,cryptography,public-key-encryption,cryptographic-hash-function,wincrypt,Openssl,Cryptography,Public Key Encryption,Cryptographic Hash Function,Wincrypt,我正在尝试将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), gener

我正在尝试将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_算法。

它不是。或空KDF,或fx->x

DH_compute_key执行原始DH操作并返回结果


BCryptDeriveKey的所有记录的KDF值都不会返回原始值。他们总是可能添加了尚未添加到文档中的BCRYPT_KDF值,您需要从最新的SDK版本中检查BCRYPT.h。

OpenSSL主要遵循RFC。请参见,您可以指定openssl用于从私钥和公钥派生约定密钥的派生函数。像这样的。对于上面显示的代码,它看起来像未经身份验证的Diffie Hellman。这只是一个指数。OpenSSL在TLS中的用途取决于所选的密码套件,在某种程度上取决于X509证书。一旦选择了密码套件,并且客户机具有来自X509证书的一些安全参数,客户机和服务器将按照RFC 5246中的说明进行操作。如果选择了非临时密码套件,则将使用密钥传输,并且不会执行Diffie Hellman。谢谢jww。就像你说的,它是非授权的Diffie-Hellman.Related:。顺便说一下,我要求为TLS1.3提供一种更兼容的派生方法。它在秘密值上使用HKDF,而不删除可能的前导00字节。您知道如何使用BcryptDeriveKey派生此类值吗?我应该为pwszKDF参数传递什么值?谢谢batonjs。我检查了SDK中的bcrypt.h文件。他们还不支持原始值。我可以知道您将如何使用本机windows库执行此操作吗?