OpenSSL 支持 ECDH 吗?

does OpenSSL support ECDH?

openssl_dh_compute_key() 让我觉得 OpenSSL 没有 ECDH。它只谈DH,不谈ECDH。此外,public 键基本上只是 base-256 中的素数,并且有关于如何删除 -----BEGIN PUBLIC KEY---- 的具体说明- public 键的一部分,就好像它不受支持一样。另外,从技术上讲,以 -----BEGIN PUBLIC KEY----- 开头的字符串是有效的 base-256 数字。

假设 ECDH 密钥与 ECDSA 密钥相同,那么 ECDH 的 public 密钥由 X、Y 坐标和曲线(无论是命名的还是指定的曲线)组成,并且不是很明显是什么public 密钥需要使用的格式才能使 openssl_dh_compute_key() 工作。

None-the-less 我尝试了,令我惊讶的是,我没有收到错误,但也没有得到任何输出。

$public = '-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkldhVs+UpzZ/E6hYF536mSYvdnfN
oEa/Idsfu7pBEcqPGHTsp+zDM/rquKwr8eoxn554LYw/3udRgzEpHk4vag==
-----END PUBLIC KEY-----';

$private = openssl_pkey_get_private('-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgF1ZD0LhQm5q71gL9
O+yzfX8g/sdYTBz/50nkw6wrE16hRANCAAQeZkUZ3ey7W5Czz52pOLmgSBHlnI3u
9gLcbr9NVCecEstDR0EK2+fJMfokogfW+RdoEJKN0qLdHilGPGHV/aq1
-----END PRIVATE KEY-----');

$s = openssl_dh_compute_key($public, $private);

echo bin2hex($s);

echo "\n\n";

echo openssl_error_string();

$s 是错误的。

OpenSSL 支持 ECDH。我的猜测 PHP 并没有像支持 DH 那样公开支持 ECDH 所需的 ECDH 方法。

我的猜测是,ECH 被推荐使用 EVP 功能,这将在某种程度上抽象 DH 指定的内容,而 ECDH_compute_key 的使用并没有真正的记录。

看起来 PHP 没有公开足够的 EVP 功能来支持 ECDH。