OpenSSL

密碼學和 SSL/TLS 工具包

EVP_KEYEXCH-DH

名稱

EVP_KEYEXCH-DH - DH 金鑰交換演算法支援

說明

DH 金鑰類型的金鑰交換支援。

DH 金鑰交換參數

"pad" (OSSL_EXCHANGE_PARAM_PAD) <未簽署整數>

設定相關聯金鑰交換 ctx 的填補模式。設定值 1 會開啟填補。設定值 0 會關閉填補。如果填補關閉,則衍生的共用密碼可能會小於最大的可能密碼大小。如果填補開啟,則衍生的共用密碼會在必要時用 0 填滿其開頭位元組,以使共用密碼與最大的可能密碼大小相同。當 KDF 類型設定為 "X942KDF-ASN1" (OSSL_KDF_NAME_X942KDF_ASN1) 時,會忽略填補模式參數(並隱含啟用填補)。

"kdf-type" (OSSL_EXCHANGE_PARAM_KDF_TYPE) <UTF8 字串>

請參閱 provider-keyexch(7) 中的「共用金鑰交換參數」

"kdf-digest" (OSSL_EXCHANGE_PARAM_KDF_DIGEST) <UTF8 字串>

請參閱 provider-keyexch(7) 中的「共用金鑰交換參數」

"kdf-digest-props" (OSSL_EXCHANGE_PARAM_KDF_DIGEST_PROPS) <UTF8 字串>

請參閱 provider-keyexch(7) 中的「共用金鑰交換參數」

"kdf-outlen" (OSSL_EXCHANGE_PARAM_KDF_OUTLEN) <未簽署整數>

請參閱 provider-keyexch(7) 中的「共用金鑰交換參數」

"kdf-ukm" (OSSL_EXCHANGE_PARAM_KDF_UKM) <八位元組字串>

請參閱 provider-keyexch(7) 中的「共用金鑰交換參數」

"cekalg" (OSSL_KDF_PARAM_CEK_ALG) <八位元組字串指標>

請參閱 provider-kdf(7) 中的「KDF 參數」

範例

範例假設主機和對等方都使用相同的名稱群組(或網域參數)產生金鑰。請參閱 EVP_PKEY-DH(7) 中的「範例」。主機和對等方都會將其公開金鑰傳輸給彼此。

若要將對等方產生的金鑰對轉換為 DER 格式的公開金鑰,以便傳輸至主機

EVP_PKEY *peer_key; /* It is assumed this contains the peers generated key */
unsigned char *peer_pub_der = NULL;
int peer_pub_der_len;

peer_pub_der_len = i2d_PUBKEY(peer_key, &peer_pub_der);
...
OPENSSL_free(peer_pub_der);

若要在主機上從 DER 格式轉換接收到的對等方公開金鑰

const unsigned char *pd = peer_pub_der;
EVP_PKEY *peer_pub_key = d2i_PUBKEY(NULL, &pd, peer_pub_der_len);
...
EVP_PKEY_free(peer_pub_key);

若要在主機上使用主機的金鑰和對等方的公開金鑰衍生共用密碼

/* It is assumed that the host_key and peer_pub_key are set up */
void derive_secret(EVP_KEY *host_key, EVP_PKEY *peer_pub_key)
{
    unsigned int pad = 1;
    OSSL_PARAM params[2];
    unsigned char *secret = NULL;
    size_t secret_len = 0;
    EVP_PKEY_CTX *dctx = EVP_PKEY_CTX_new_from_pkey(NULL, host_key, NULL);

    EVP_PKEY_derive_init(dctx);

    /* Optionally set the padding */
    params[0] = OSSL_PARAM_construct_uint(OSSL_EXCHANGE_PARAM_PAD, &pad);
    params[1] = OSSL_PARAM_construct_end();
    EVP_PKEY_CTX_set_params(dctx, params);

    EVP_PKEY_derive_set_peer(dctx, peer_pub_key);

    /* Get the size by passing NULL as the buffer */
    EVP_PKEY_derive(dctx, NULL, &secret_len);
    secret = OPENSSL_zalloc(secret_len);

    EVP_PKEY_derive(dctx, secret, &secret_len);
    ...
    OPENSSL_clear_free(secret, secret_len);
    EVP_PKEY_CTX_free(dctx);
}

對等方可以使用非常類似的程式碼,使用主機的公開金鑰和對等方產生的金鑰對,來衍生相同的共享密碼。

另請參閱

EVP_PKEY-DH(7)EVP_PKEY-FFC(7)EVP_PKEY(3)provider-keyexch(7)provider-keymgmt(7)OSSL_PROVIDER-default(7)OSSL_PROVIDER-FIPS(7)

版權所有 2020-2022 OpenSSL 專案作者。保留所有權利。

在 Apache 授權 2.0(「授權」)下授權。您只能在遵守授權的情況下使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案或 https://www.openssl.org/source/license.html 取得副本。