Почему я не могу использовать длину ключа <384 бит для E C в PHP OpenSSL? - PullRequest
3 голосов
/ 17 июня 2020

Для меня очевидно, что 384-битный ключ RSA чрезвычайно небезопасен. Есть аналогичный вопрос относительно RSA: Почему размер ключа <384 бит считается слишком маленьким для openssl_pkey_new ()? </a>

Однако 384-битный ключ E C в настоящее время считается чрезвычайно безопасным. В моем случае 384-битные слишком длинные, поэтому я хотел бы использовать 256-битные ключи.

Почему следующий код выдает Warning: openssl_pkey_new(): private key length is too short; it needs to be at least 384 bits, not 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_pkey_new() действительно имеет одинаковые требования для RSA и E C?

1 Ответ

1 голос
/ 18 июня 2020

Из исходного кода PHP видно, что openssl_pkey_new вызывает php_openssl_generate_private_key, который проверяет размер ключа, переданный с помощью private_key_bits, независимо от типа ключа, и возвращает опубликованную ошибку, если размер меньше MIN_KEY_LENGTH, который определяется как 384. Это относится к текущей версии (v 7.4.7) до v 4.0. В отличие от текущей версии, v 4.0 только поддерживает ключи RSA, поэтому можно сделать вывод, что размер ключа 384 бит относится к ключам RSA.

Поскольку E C ключей меньше, чем ключи RSA с сопоставимой безопасностью ( NIST и ECRYPT , Глава 7 , Рекомендуемый размер ключа ), более полезной будет проверка c с указанием типа ключа. Минимальная длина для ключей E C в 384 бит не является разумной. Но и для RSA значение 384 битов слишком мало с сегодняшней точки зрения.

В php_openssl_generate_private_key также можно увидеть, что во время генерации ключа размер ключа используется только в контексте RSA, DSA и ключи DH, но совсем не в контексте ключей E C, где вместо этого используется имя кривой. Т.е. размер ключа, указанный с помощью private_key_bits, не требуется для контекста ключей E C (и, вероятно, не предназначен), и поэтому его следует опустить, что также позволяет избежать сообщения об ошибке:

<?php
$config = array(
    "private_key_type" => OPENSSL_KEYTYPE_EC,
    "curve_name" => "prime256v1"
);

$res = openssl_pkey_new($config);
print_r(openssl_pkey_get_details($res));
?>

For полнота: если размер ключа не указан с помощью private_key_bits, он инициализируется значением по умолчанию из файла конфигурации OpenSSL, которое составляет 2048 бит для текущей версии. Это значение соответствует текущей рекомендации для RSA ( NIST , Рекомендации по управлению ключами , 2.2.1 Рекомендуемые размеры ключей и алгоритмы ) а также является причиной того, что сообщение об ошибке не запускается в контексте ключей E C.

...