<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.openssl.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'function.openssl-dh-compute-key.php',
    1 => 'openssl_dh_compute_key',
    2 => 'Calcula un secreto compartido para un valor p&uacute;blico de la clave DH p&uacute;blica remota y la clave DH local',
  ),
  'up' => 
  array (
    0 => 'ref.openssl.php',
    1 => 'Funciones de OpenSSL',
  ),
  'prev' => 
  array (
    0 => 'function.openssl-decrypt.php',
    1 => 'openssl_decrypt',
  ),
  'next' => 
  array (
    0 => 'function.openssl-digest.php',
    1 => 'openssl_digest',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/openssl/functions/openssl-dh-compute-key.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.openssl-dh-compute-key" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">openssl_dh_compute_key</h1>
  <p class="verinfo">(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">openssl_dh_compute_key</span> &mdash; <span class="dc-title">Calcula un secreto compartido para un valor público de la clave DH pública remota y la clave DH local</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.openssl-dh-compute-key-description">
  <h3 class="title">Descripción</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>openssl_dh_compute_key</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$public_key</code></span>, <span class="methodparam"><span class="attribute"><a href="class.sensitiveparameter.php">#[\SensitiveParameter]</a> </span><span class="type"><a href="class.opensslasymmetrickey.php" class="type OpenSSLAsymmetricKey">OpenSSLAsymmetricKey</a></span> <code class="parameter">$private_key</code></span>): <span class="type"><span class="type"><a href="language.types.string.php" class="type string">string</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">
   El secreto compartido devuelto por <span class="function"><strong>openssl_dh_compute_key()</strong></span> se
   utiliza a menudo como una clave de cifrado para comunicarse de forma secreta con
   una parte remota. Esto es conocido como el intercambio de claves Diffie-Hellman.
  </p>
  <div class="caution"><strong class="caution">Precaución</strong>
   <p class="para">
    Es importante utilizar los mismos parámetros DH para los pares de claves locales y remotas; de lo contrario, el
    secreto generado entre las dos partes no coincidirá.
   </p>
  </div>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <span class="simpara">
    ECDH solo es compatible a partir de PHP 8.1.0 <em>y</em> OpenSSL 3.0.0.
   </span>
  </p></blockquote>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.openssl-dh-compute-key-parameters">
  <h3 class="title">Parámetros</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">public_key</code></dt>
     <dd>
      <p class="para">
       Clave DH pública de la parte remota.
      </p>
     </dd>
    
    
     <dt><code class="parameter">private_key</code></dt>
     <dd>
      <p class="para">
       Una clave DH privada local, correspondiente a la clave pública a compartir con la parte remota.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.openssl-dh-compute-key-returnvalues">
  <h3 class="title">Valores devueltos</h3>
  <p class="para">
   Devuelve el secreto compartido en caso de éxito o <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> si ocurre un error.
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.openssl-dh-compute-key-changelog">
  <h3 class="title">Historial de cambios</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Versión</th>
      <th>Descripción</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.0.0</td>
      <td>
       <code class="parameter">private_key</code> ahora acepta una instancia de
       <span class="classname"><a href="class.opensslasymmetrickey.php" class="classname">OpenSSLAsymmetricKey</a></span> ;
       anteriormente, se aceptaba un <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> de tipo <code class="literal">OpenSSL key</code>.
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>


  <div class="refsect1 examples" id="refsect1-function.openssl-dh-compute-key-examples">
  <h3 class="title">Ejemplos</h3>
  <p class="para">

   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Calcular un secreto compartido</strong></p>
    <div class="example-contents"><p>
     Primero, se genera localmente un par de claves DH pública/privada y se solicita a la parte remota que haga lo mismo. Se debe utilizar
     la utilidad de línea de comandos <code class="literal">openssl</code>
    </p></div>
    <div class="example-contents">
<div class="shellcode"><pre class="shellcode"># generar un par de claves privada/pública
openssl dhparam -out dhparam.pem 2048
openssl genpkey -paramfile dhparam.pem -out privatekey.pem

# extraer solo la clave pública
openssl pkey -in privatekey.pem -pubout -out publickey.pem</pre>
</div>
    </div>

    <div class="example-contents"><p>
     Ahora, envíe su clave pública a la parte remota. Utilice el comando <code class="literal">openssl pkey</code> para mostrar la clave pública que le
     será enviada por la parte remota.
    </p></div>
    <div class="example-contents">
<div class="shellcode"><pre class="shellcode">openssl pkey -pubin -in remotepublickey.pem -text -noout</pre>
</div>
    </div>

    <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">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...]</pre>
</div>
    </div>
    <div class="example-contents"><p>
     Utilizar esta clave pública como argumento para <span class="function"><strong>openssl_dh_compute_key()</strong></span>
     para calcular el secreto compartido.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$remote_public_key </span><span style="color: #007700">= </span><span style="color: #DD0000">'67e5e5fae07b0f962cdc96445f50029e8dc26c0468b0d11d7566fc63f5e34230b896c145cc0860b4213bddee6688db77d91e1189d45cf27af2f1fe1c779d6f13b8b25600efcb3b6079740298f5f98e3eb56208deca8cc3404a8079d5430617a81956afcc955ee2322dd2147b765a9af13c767635cc7bc1a5f439e5b6ca713f7c3f97e5ab86c1cd0ee6ee04c9e62d807e59c049ebb6644fa8f9bba387b33d76019e2b1694a43730fb35e263be2390b9ef3f464604948f60797a5155d61a1df5d97f4a3eaaacb0d082ccc2e094e054c117830b74084d5a79aeff7f1c04ab23394aae87835543ab7a7c049d2080bbaf5f16a3e320b921478cf87fa860809e617736'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$local_priv_key </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_pkey_get_private</span><span style="color: #007700">(</span><span style="color: #DD0000">'file://privatekey.pem'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$shared_secret </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_dh_compute_key</span><span style="color: #007700">(</span><span style="color: #0000BB">hex2bin</span><span style="color: #007700">(</span><span style="color: #0000BB">$remote_public_key</span><span style="color: #007700">), </span><span style="color: #0000BB">$local_priv_key</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">bin2hex</span><span style="color: #007700">(</span><span style="color: #0000BB">$shared_secret</span><span style="color: #007700">).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Ejemplo #2 Generar un par de claves DH pública/privada en PHP</strong></p>
    <div class="example-contents"><p>Primero, generar el número primo DH</p></div>
    <div class="example-contents">
<div class="shellcode"><pre class="shellcode">openssl dhparam -out dhparam.pem 2048
openssl dh -in dhparam.pem -noout  -text</pre>
</div>
    </div>

    <div class="example-contents"><p>Resultado del ejemplo anterior es similar a:</p></div>
    <div class="example-contents screen">
<div class="examplescode"><pre class="examplescode">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)</pre>
</div>
    </div>
    <div class="example-contents"><p>
     El número primo y los valores del generador se pasan como
     p y q en <span class="function"><a href="function.openssl-pkey-new.php" class="function">openssl_pkey_new()</a></span>
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$configargs </span><span style="color: #007700">= array();<br /></span><span style="color: #0000BB">$configargs</span><span style="color: #007700">[</span><span style="color: #DD0000">'p'</span><span style="color: #007700">] = </span><span style="color: #0000BB">hex2bin</span><span style="color: #007700">(</span><span style="color: #DD0000">'00a3251e733f44b92beef49d9f376a4bfd1dbdf4afdac810775941c65f73d2882939cd1c5fc39f0f22d29c20c1e4c01803b8b6d8daad3b39a6da8efe1230e9035d22baef18d27b69f95bcb78c60c8c6bf24992c249e0457772b3553630f2401789185003fa2d547a7f344c7332b688145114be805795e6a3f651ff17474f15d60e6c4753722c2a4c21cb7df34997c9475e40337b99527e7af3522780de1b266b40bb14110bfbe6d82fcfa0062f96b91c0bb4cbd3a6629c4867f681f2c6ff45030a9d679dce27d96b485dcafbc25d849b8bcb40c7a40c8a6ef4abbab610c3b8254dcf6096f4dbe8001c58477afb5186d122d74e94317ad5da3d53dedabb648d626b'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$configargs</span><span style="color: #007700">[</span><span style="color: #DD0000">'g'</span><span style="color: #007700">] = </span><span style="color: #0000BB">hex2bin</span><span style="color: #007700">(</span><span style="color: #DD0000">'02'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$private_key </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_pkey_new</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'dh' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$configargs</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">openssl_pkey_export_to_file</span><span style="color: #007700">(</span><span style="color: #0000BB">$private_key</span><span style="color: #007700">,</span><span style="color: #DD0000">'privatekey.pem'</span><span style="color: #007700">,</span><span style="color: #0000BB">$passphrase</span><span style="color: #007700">=</span><span style="color: #DD0000">'y0urp@s5phr@se'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$details </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_pkey_get_details</span><span style="color: #007700">(</span><span style="color: #0000BB">$private_key</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$local_pub_key </span><span style="color: #007700">= </span><span style="color: #0000BB">$details</span><span style="color: #007700">[</span><span style="color: #DD0000">'dh'</span><span style="color: #007700">][</span><span style="color: #DD0000">'pub_key'</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">bin2hex</span><span style="color: #007700">(</span><span style="color: #0000BB">$local_pub_key</span><span style="color: #007700">).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// puede enviar su clave pública a la parte remota<br /><br /></span><span style="color: #0000BB">$details </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_pkey_get_details</span><span style="color: #007700">(</span><span style="color: #0000BB">openssl_pkey_get_public</span><span style="color: #007700">(</span><span style="color: #DD0000">"file://remotepublickey.pem"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$remote_public_key </span><span style="color: #007700">= </span><span style="color: #0000BB">$details</span><span style="color: #007700">[</span><span style="color: #DD0000">'dh'</span><span style="color: #007700">][</span><span style="color: #DD0000">'pub_key'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$shared_secret </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_dh_compute_key</span><span style="color: #007700">(</span><span style="color: #0000BB">$remote_public_key</span><span style="color: #007700">, </span><span style="color: #0000BB">$private_key</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">bin2hex</span><span style="color: #007700">(</span><span style="color: #0000BB">$shared_secret</span><span style="color: #007700">).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.openssl-dh-compute-key-seealso">
  <h3 class="title">Ver también</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.openssl-pkey-new.php" class="function" rel="rdfs-seeAlso">openssl_pkey_new()</a> - Genera una nueva clave privada</span></li>
    <li><span class="function"><a href="function.openssl-pkey-get-details.php" class="function" rel="rdfs-seeAlso">openssl_pkey_get_details()</a> - Devuelve un array que contiene los detalles de la clave</span></li>
    <li><span class="function"><a href="function.openssl-pkey-get-private.php" class="function" rel="rdfs-seeAlso">openssl_pkey_get_private()</a> - Lee una clave privada</span></li>
    <li><span class="function"><a href="function.openssl-pkey-get-public.php" class="function" rel="rdfs-seeAlso">openssl_pkey_get_public()</a> - Extrae una clave p&uacute;blica de un certificado y la prepara</span></li>
   </ul>
  </p>
 </div>


</div><?php manual_footer($setup); ?>