为什么可以';t我使用键长度<;PHP OpenSSL中EC的384位?
很明显,384位RSA密钥是非常不安全的。 关于RSA也有一个类似的问题:为什么对于openssl_pkey_new(),keysize<384位被认为太小了 然而,384位EC密钥目前被认为是非常安全的。 在我的例子中,384位太长,这就是为什么我想使用256位键 为什么以下代码抛出为什么可以';t我使用键长度<;PHP OpenSSL中EC的384位?,php,cryptography,elliptic-curve,php-openssl,Php,Cryptography,Elliptic Curve,Php Openssl,很明显,384位RSA密钥是非常不安全的。 关于RSA也有一个类似的问题:为什么对于openssl_pkey_new(),keysize
警告:openssl\u pkey\u new():私钥长度太短;它至少需要384位,而不是256位
<?php
$config = array(
"private_key_type" => OPENSSL_KEYTYPE_EC,
"private_key_bits" => 256,
"curve_name" => "prime256v1"
);
// Create the private and public key
$res = openssl_pkey_new($config);
从中可以看出,openssl\u pkey\u new
调用php\u openssl\u generate\u private\u key
,它检查用private\u key\u位传递的密钥大小,而不考虑密钥类型,如果大小小于MIN\u key\u LENGTH
,则返回发布的错误,定义为384
。这适用于从V7.4.7到V4.0的当前版本。与当前版本相比,V4.0仅支持RSA密钥,因此可以由此得出结论,384
位的密钥大小指的是RSA密钥
由于EC密钥比安全性相当的RSA密钥小(第7章,推荐密钥大小),因此特定于密钥类型的检查更有用。384
位的EC密钥的最小长度不合理。但对于RSA来说,384
位的值在今天看来太小了
在php_openssl_generate_private_key
中还可以看到,在密钥生成过程中,密钥大小仅用于RSA、DSA和DH密钥的上下文中,而完全不用于EC密钥的上下文中,其中使用了曲线名称。也就是说,EC密钥上下文中不需要使用私钥位指定的密钥大小(可能不是预期的),因此应省略,这也避免了错误消息:
<?php
$config = array(
"private_key_type" => OPENSSL_KEYTYPE_EC,
"curve_name" => "prime256v1"
);
$res = openssl_pkey_new($config);
print_r(openssl_pkey_get_details($res));
?>
为了完整性:如果未使用private\u key\u bits
指定密钥大小,则将使用OpenSSL配置文件中的默认值对其进行初始化,对于当前版本,该值为2048
位。此值对应于RSA的当前建议值(,2.2.1建议的密钥大小和算法),也是在EC密钥上下文中未触发错误消息的原因 openssl\u pkey\u new
调用php\u openssl\u generate\u private\u key
,检查指定的密钥大小是否小于定义为384
的MIN\u key\u LENGTH
。这适用于V4.0以下的当前版本,该版本仅支持RSA密钥。所以这可能是指RSA(根据今天的标准,384对于RSA来说也太小了)。在EC关键点的上下文中,在生成过程中根本不使用关键点大小,而仅使用曲线名称。只需在EC密钥的上下文中省略密钥大小,就不会触发错误。@Topaco:不幸的是,许多php文档都很糟糕,因此stackoverflow必须作为php文档使用。你能回答这个问题吗?Topaco,非常感谢。多亏了你的建议,我才有了这个工作。是的,请回答,我很乐意接受!谢谢。我希望PHP文档在这种情况下会更好!