-1

我正在尝试将 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 使用什么密钥协商函数来创建这样的密钥。提前致谢。

4

2 回答 2

3

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

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

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

于 2017-09-27T06:10:23.950 回答
2

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

BCRYPT_DH_ALGORITHM当然是。

于 2017-09-27T00:36:07.510 回答