OpenSSL是否支持ECDH?

时间:2019-05-20 13:43:03

标签: php openssl php-openssl

https://php.net/openssl-dh-compute-key使我认为不是。它仅谈论DH,而不是ECDH。此外,公钥基本上只是以256为基数的质数,并且有关于如何删除公钥的-----BEGIN PUBLIC KEY-----组件的具体说明,因为它不受支持。另外,从技术上讲,以-----BEGIN PUBLIC KEY-----开头的字符串是有效的以256为底的数字。

此外,假设ECDH密钥与ECDSA密钥相同,则ECDH的公共密钥由X,Y坐标和曲线(无论是命名曲线还是指定曲线)组成,并且立即知道该公共密钥的格式是什么需要openssl_dh_compute_key()才能正常工作。

我一直没有尝试,但令我惊讶的是,我没有收到错误,但也没有得到任何输出:

<?php

$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是错误的。

1 个答案:

答案 0 :(得分:1)

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

我的猜测是,建议ECH使用EVP功能,该功能会稍微抽象DH指定的内容,而ECDH_compute_key的使用并未真正记录。

PHP似乎没有提供足够的EVP功能来支持ECDH。