根据OpenSSL ChangeLog的说法,OpenSSL 1.1.1添加了对EdDSA (包括Ed25519)的支持。我正在运行PHP7.3.5和OpenSSL 1.1.1b,它应该支持它。我试着使用Ed25519 (来自https://www.rfc-editor.org/rfc/rfc8410#section-10.3的那个)。这使我得到了以下错误(由openssl_error_string()返回)和"Ed25519私有密钥不带公钥“的密钥。
错误:0608D096:此密钥类型不支持数字信封routines:EVP_PKEY_sign_init:operation
“用属性和公钥编码的Ed25519私钥”键给了我一个不同的错误。
警告: openssl_sign():无法在第3行的/path/to/test.php中将提供的密钥参数强制为私钥。错误:0D078094:ASN1编码routines:asn1_item_embed_d2i:sequence长度不匹配
这是我使用的代码。
$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。
发布于 2019-05-21 03:27:17
我想不是的,如果我们使用documentation,看起来签名/验证要求与openssl库的正常使用不同。
Ed25519和Ed448 EVP_PKEY实现支持使用PureEdDSA和Ed25519或Ed448 (参见RFC8032)的密钥生成、一次性摘要签名和摘要验证。
评论如下:
PureEdDSA算法不支持使用例如EVP_DigestUpdate()的其他签名算法的流机制。必须使用one-shot EVP_DigestSign()和EVP_DigestVerify()函数传递要签名或验证的消息。
调用EVP_DigestSignInit()或EVP_DigestVerifyInit()时,摘要类型参数必须设置为NULL。
因此,除非您可以直接调用openssl api,或者可以添加更多的openssl粘合函数来支持一次性签名/验证支持,否则我猜不会。
https://stackoverflow.com/questions/56222067
复制相似问题