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
是错误的。
答案 0 :(得分:1)
OpenSSL确实支持ECDH。我的猜测是PHP没有像DH那样公开支持ECDH所需的ECDH方法。
我的猜测是,建议ECH使用EVP功能,该功能会稍微抽象DH指定的内容,而ECDH_compute_key的使用并未真正记录。
PHP似乎没有提供足够的EVP功能来支持ECDH。