-1

我想将一个openssl代码替换为CNG winapi代码。下面是我拥有的准系统openssl代码。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用来创建这样的密钥的关键协议函数是什么? 在此先感谢。

+0

OpenSSL大多遵循RFC。请参阅[RFC 5246,传输层安全性(TLS)协议版本1.2](https://www.ietf.org/rfc/rfc5246.txt) – jww

+0

可以请您指定openssl使用的派生函数来导出商定的密钥来自私人和公共钥匙。像这样的东西。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa375393(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ aa375534(v = vs.85).aspx –

+0

对于上面显示的代码,它看起来像未验证的Diffie-Hellman。它只是一个指数。 OpenSSL在TLS中的用途取决于选择的密码套件,并且在某种程度上取决于X509证书。一旦选择了密码套件并且客户端具有来自X509证书的一些安全参数,则客户端和服务器将按照RFC 5246中的描述进行操作。如果选择了非短暂加密套件,则将使用密钥传输并且Diffie-Hellman将不会执行。 – jww

回答

3

它没有。或者“NULL KDF”,或f(x) -> x

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

没有记录的KDF值为BCryptDeriveKey返回原始值。他们总会添加尚未添加到文档中的BCRYPT_KDF值,因此您需要从最新的SDK版本中检查bcrypt.h

+0

谢谢batonjs。我检查了SDK中的bcrypt.h文件。他们还没有支持原始数据。我可以知道你将如何使用本机窗口库来做到这一点吗? –

2

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

+0

你知道如何使用BcryptDeriveKey派生这样的值吗?我应该为pwszKDF参数传递什么值? –

+0

谢谢马丁。 –