# openssl_dh_compute_key

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

openssl_dh_compute_key — Calcule un secret partagé pour une valeur publique de la clé DH publique distante et la clé DH locale

### Description

openssl_dh_compute_key(string `$public_key`, #[\SensitiveParameter] OpenSSLAsymmetricKey `$private_key`): string|false

Le secret partagé retourné par openssl_dh_compute_key() est souvent utilisé comme une clé de chiffrement pour communiquer secrètement avec une partie distante. Ceci est connue sous l'échange de clé Diffie-Hellman.

Attention

Il est important d'utiliser les mêmes paramètres DH pour les paires de clés locales et distantes ; sinon, le secret généré entre les deux parties ne correspondra pas.

> Note: ECDH n'est supporté qu'à partir de PHP 8.1.0 et OpenSSL 3.0.0.

### Liste de paramètres

`public_key`

  Clé DH publique de la partie distante.

`private_key`

  Une clé DH privée locale, correspondant à la clé publique à partager avec la partie distante.

### Valeurs de retour

Retourne le secret partagé en cas de succès ou `false` si une erreur survient.

### Historique

Version | Description
--- | ---
8.0.0 | `private_key` accepte désormais une instance de OpenSSLAsymmetricKey ; auparavant, une resource de type `OpenSSL key` était acceptée.

### Exemples

Exemple #1 Calcule un secret partagé

Tout d'abord générez localement une paire de clés DH publique / privée et demandez à la partie distante de faire de même. Nous devons utiliser l'utilitaire de ligne de commande `openssl`

    # générer une paire de clé privée/publique
    openssl dhparam -out dhparam.pem 2048
    openssl genpkey -paramfile dhparam.pem -out privatekey.pem

    # extraire uniquement la clé publique
    openssl pkey -in privatekey.pem -pubout -out publickey.pem

Maintenant, envoyez votre clé publique à la partie distante. Utilisez la commande `openssl pkey` pour afficher la clé publique qui vous sera envoyé par la partie distante.

    openssl pkey -pubin -in remotepublickey.pem -text -noout

Résultat de l'exemple ci-dessus est similaire à :

    PKCS#3 DH Public-Key: (2048 bit)
        public-key:
            67:e5:e5:fa:e0:7b:0f:96:2c:dc:96:44:5f:50:02:
            9e:8d:c2:6c:04:68:b0:d1:1d:75:66:fc:63:f5:e3:
            42:30:b8:96:c1:45:cc:08:60:b4:21:3b:dd:ee:66:
            88:db:77:d9:1e:11:89:d4:5c:f2:7a:f2:f1:fe:1c:
            77:9d:6f:13:b8:b2:56:00:ef:cb:3b:60:79:74:02:
            98:f5:f9:8e:3e:b5:62:08:de:ca:8c:c3:40:4a:80:
            79:d5:43:06:17:a8:19:56:af:cc:95:5e:e2:32:2d:
            d2:14:7b:76:5a:9a:f1:3c:76:76:35:cc:7b:c1:a5:
            f4:39:e5:b6:ca:71:3f:7c:3f:97:e5:ab:86:c1:cd:
            0e:e6:ee:04:c9:e6:2d:80:7e:59:c0:49:eb:b6:64:
            4f:a8:f9:bb:a3:87:b3:3d:76:01:9e:2b:16:94:a4:
            37:30:fb:35:e2:63:be:23:90:b9:ef:3f:46:46:04:
            94:8f:60:79:7a:51:55:d6:1a:1d:f5:d9:7f:4a:3e:
            aa:ac:b0:d0:82:cc:c2:e0:94:e0:54:c1:17:83:0b:
            74:08:4d:5a:79:ae:ff:7f:1c:04:ab:23:39:4a:ae:
            87:83:55:43:ab:7a:7c:04:9d:20:80:bb:af:5f:16:
            a3:e3:20:b9:21:47:8c:f8:7f:a8:60:80:9e:61:77:
            36
     [...abbreviated...]

Utiliser cette clé publique en tant que paramètre pour openssl_dh_compute_key() fin de calculer le secret partagé.

`<?php
$remote_public_key = ' ';
$local_priv_key = openssl_pkey_get_private('file://privatekey.pem');
$shared_secret = openssl_dh_compute_key(hex2bin($remote_public_key), $local_priv_key);
echo bin2hex($shared_secret)."\n";
?>`

Exemple #2 Générer une paire de clé DH publique/privée en PHP

Tout d'abord, générer le nombre premier DH

    openssl dhparam -out dhparam.pem 2048
    openssl dh -in dhparam.pem -noout  -text

Résultat de l'exemple ci-dessus est similaire à :

    PKCS#3 DH Parameters: (2048 bit)
            prime:
                00:a3:25:1e:73:3f:44:b9:2b:ee:f4:9d:9f:37:6a:
                4b:fd:1d:bd:f4:af:da:c8:10:77:59:41:c6:5f:73:
                d2:88:29:39:cd:1c:5f:c3:9f:0f:22:d2:9c:20:c1:
                e4:c0:18:03:b8:b6:d8:da:ad:3b:39:a6:da:8e:fe:
                12:30:e9:03:5d:22:ba:ef:18:d2:7b:69:f9:5b:cb:
                78:c6:0c:8c:6b:f2:49:92:c2:49:e0:45:77:72:b3:
                55:36:30:f2:40:17:89:18:50:03:fa:2d:54:7a:7f:
                34:4c:73:32:b6:88:14:51:14:be:80:57:95:e6:a3:
                f6:51:ff:17:47:4f:15:d6:0e:6c:47:53:72:2c:2a:
                4c:21:cb:7d:f3:49:97:c9:47:5e:40:33:7b:99:52:
                7e:7a:f3:52:27:80:de:1b:26:6b:40:bb:14:11:0b:
                fb:e6:d8:2f:cf:a0:06:2f:96:b9:1c:0b:b4:cb:d3:
                a6:62:9c:48:67:f6:81:f2:c6:ff:45:03:0a:9d:67:
                9d:ce:27:d9:6b:48:5d:ca:fb:c2:5d:84:9b:8b:cb:
                40:c7:a4:0c:8a:6e:f4:ab:ba:b6:10:c3:b8:25:4d:
                cf:60:96:f4:db:e8:00:1c:58:47:7a:fb:51:86:d1:
                22:d7:4e:94:31:7a:d5:da:3d:53:de:da:bb:64:8d:
                62:6b
            generator: 2 (0x2)

Le nombre premier et les valeurs du générateurs sont passées en tant que p et q dans openssl_pkey_new()

`<?php
$configargs = array();
$configargs['p'] = hex2bin(' ');
$configargs['g'] = hex2bin('02');
$private_key = openssl_pkey_new(array('dh' => $configargs));
openssl_pkey_export_to_file($private_key,'privatekey.pem',$passphrase='y0urp@s5phr@se');
$details = openssl_pkey_get_details($private_key);
$local_pub_key = $details['dh']['pub_key'];
echo bin2hex($local_pub_key)."\n";
// vous pouvez envoyer votre clé publique à la partie distante
$details = openssl_pkey_get_details(openssl_pkey_get_public("file://remotepublickey.pem"));
$remote_public_key = $details['dh']['pub_key'];
$shared_secret = openssl_dh_compute_key($remote_public_key, $private_key);
echo bin2hex($shared_secret)."\n";
?>`

### Voir aussi

- openssl_pkey_new() - Génère une nouvelle clé privée
- openssl_pkey_get_details() - Retourne un tableau contenant les détails de la clé
- openssl_pkey_get_private() - Lit une clé privée
- openssl_pkey_get_public() - Extrait une clé publique d'un certificat, et la prépare