openssl_dh_compute_key返回false

时间:2016-09-24 02:31:58

标签: php diffie-hellman php-openssl

我正在尝试使用PHP计算ECDH(椭圆曲线Diffie Hellman)的共享密钥。

假设我有某人的公钥:

$clientPublickey="BOLcHOg4ajSHR6BjbSBeX_6aXjMu1V5RrUYXqyV_FqtQSd8RzdU1gkMv1DlRPDIUtFK6Nd16Jql0eSzyZh4V2uc";

我使用openssl生成我的密钥:

exec('openssl ecparam -genkey -name prime256v1 -noout -out example-ecc.pem');
$private = openssl_pkey_get_private("file://example-ecc.pem");

然后我打电话给:

$sharedSecret=openssl_dh_compute_key(base64_decode($clientPublickey), $private);

......我弄错了。 调用openssl_error_string()不返回任何内容,没有错误。

我已经var_dumped openssl_pkey_get_details($ private)并验证它是否已正确创建。

有人建议吗?这个功能似乎没有太多信息。 http://php.net/manual/en/function.openssl-dh-compute-key.php

2 个答案:

答案 0 :(得分:0)

https://www.openssl.org/docs/manmaster/crypto/DH_compute_key.html将该功能描述为(非EC)Diffie Hellman。您需要ECDH_compute_key(我不知道PHP是否公开)。

虽然https://wiki.openssl.org/index.php/Elliptic_Curve_Diffie_Hellman建议使用EVP_PKEY包装器而不是低级例程。但是,再说一遍,我不能说PHP有什么支持。

答案 1 :(得分:0)

一个很老的帖子,但是仍然。

我认为您的公钥不是在Base64中格式化的,而是在URL-safe-Base64中格式化的。
参见:https://en.wikipedia.org/wiki/Base64#URL_applications

此外,您现在也可以从PHP创建密钥。使用openssl_pkey_new()
参见:https://www.php.net/manual/en/function.openssl-pkey-new.php