我正在尝试使用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
答案 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