openssl使用的密钥协议(或密钥派生)函数是什么?
我想将一个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用来创建这样的密钥的关键协议函数是什么? 在此先感谢。
它没有。或者“NULL KDF”,或f(x) -> x
。
DH_compute_key
执行原始DH操作并返回结果。
没有记录的KDF值为BCryptDeriveKey
返回原始值。他们总会添加尚未添加到文档中的BCRYPT_KDF值,因此您需要从最新的SDK版本中检查bcrypt.h
。
谢谢batonjs。我检查了SDK中的bcrypt.h文件。他们还没有支持原始数据。我可以知道你将如何使用本机窗口库来做到这一点吗? –
在使用任何KDF之前,您得到的只是Diffie-Hellman(DH)密钥协议的直接结果。除此之外,我不确定你期望我们说什么。它是一个无符号的大端数字,范围最大为密钥大小(1024位),以字节为单位(128字节)。当然,这将是BCRYPT_DH_ALGORITHM
。
你知道如何使用BcryptDeriveKey派生这样的值吗?我应该为pwszKDF参数传递什么值? –
谢谢马丁。 –
OpenSSL大多遵循RFC。请参阅[RFC 5246,传输层安全性(TLS)协议版本1.2](https://www.ietf.org/rfc/rfc5246.txt) – jww
可以请您指定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 –
对于上面显示的代码,它看起来像未验证的Diffie-Hellman。它只是一个指数。 OpenSSL在TLS中的用途取决于选择的密码套件,并且在某种程度上取决于X509证书。一旦选择了密码套件并且客户端具有来自X509证书的一些安全参数,则客户端和服务器将按照RFC 5246中的描述进行操作。如果选择了非短暂加密套件,则将使用密钥传输并且Diffie-Hellman将不会执行。 – jww