根据ReactDOM.createPortal
,OpenSSL 1.1.1添加了对EdDSA(包括Ed25519)的支持。我正在运行带有OpenSSL 1.1.1b的PHP 7.3.5,因此似乎它应该支持它。我尝试使用Ed25519(来自Here is a demo的版本)。这给我带来了以下错误(由openssl_error_string
返回),错误为“ Ed25519私钥,没有公钥”:
error:0608D096:digital envelope routines:EVP_PKEY_sign_init:operation not supported for this keytype
“ 用属性和公钥编码的Ed25519私钥”密钥给我一个不同的错误:
Warning: openssl_sign(): supplied key param cannot be coerced into a private key in /path/to/test.php on line 3
bad
error:0D078094:asn1 encoding routines:asn1_item_embed_d2i:sequence length mismatch
我的代码:
<?php
$r = openssl_sign('hello, world!', $signature, '-----BEGIN PRIVATE KEY-----
MHICAQEwBQYDK2VwBCIEINTuctv5E1hK1bbY8fdp+K06/nwoy/HU++CXqI9EdVhC
oB8wHQYKKoZIhvcNAQkJFDEPDA1DdXJkbGUgQ2hhaXJzgSEAGb9ECWmEzf6FQbrB
Z9w7lshQhqowtrbLDFw4rXAxZuE=
-----END PRIVATE KEY-----');
echo $r ? 'good' : 'bad';
echo "\n";
echo openssl_error_string();
我猜PHP只是还不支持Ed25519?
答案 0 :(得分:1)
我想不是,如果我们通过documentation,看起来签名/验证要求与openssl库的常规用法不同:
Ed25519和Ed448 EVP_PKEY实现支持密钥生成, 使用PureEdDSA和Ed25519一次完成摘要签名并进行摘要验证,或者 Ed448(请参阅RFC8032)。
和类似的评论:
PureEdDSA算法不支持 其他签名算法,例如使用EVP_DigestUpdate()。的 要签名或验证的消息必须一键传递 EVP_DigestSign()和EVP_DigestVerify()函数。
在调用EVP_DigestSignInit()或EVP_DigestVerifyInit()时,摘要类型 参数必须设置为NULL。
因此,除非您可以直接调用openssl api或可以添加更多的openssl胶合功能来支持一个镜头签名/验证支持,否则我猜不是。