如何使用OpenSSL函数计算用于TLS密钥交换的公共密钥?

时间:2020-04-12 11:22:45

标签: c++ openssl x25519

我正在学习TLS 1.3方案,并尝试在C ++中实现基本的握手步骤,而无需使用来自SSL_acceptSSL_do_handshake等OpenSSL的现成包装器。该项目已经将OpenSSL用于常见的加密操作,因此我不希望将其与x25519计算比在OpenSSL中更为明显的任何其他加密库链接。所以...

有两个缓冲区:

unsigned char private_key[32];
RAND_bytes(private_key, 32);

unsigned char public_key[32];
memset(public_key, 0, 32);

我应该使用哪种OpenSSL方法,使用x25519算法(从复制和分配分配到尽可能少的数据),用public_key计算出的字节填充private_key缓冲区?

1 个答案:

答案 0 :(得分:1)

使用函数EVP_PKEY创建一个EVP_PKEY_new_raw_private_key对象,如下所述:

https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_new_raw_private_key.html

    EVP_PKEY key = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL, private_key, sizeof(private_key));
    if (key == NULL)
        /* Error */;

然后您可以使用函数EVP_PKEY_get_raw_public_key获取公共密钥字节,如上一页所述:

    size_t publen = sizeof(public_key);
    if (!EVP_PKEY_get_raw_public_key(key, public_key, &publen))
        /* Error */;