Openssl get curve names: примеры (PHP)

Функция openssl_get_curve_names в PHP 8 - полный обзор с практическими примерами
Раздел: Шифрование (OpenSSL)
openssl_get_curve_names: array|false
Описание функции openssl_get_curve_names

Функция openssl_get_curve_names() возвращает массив с именами эллиптических кривых, доступных для использования в операциях шифрования через модуль OpenSSL. Она применяется в криптографических задачах, связанных с асимметричным шифрованием, например, при генерации ключей ECDSA или установке соединений по протоколам TLS.

Функция не принимает аргументов. Она вызывается без параметров и возвращает индексированный массив строк или false в случае ошибки. Возвращаемые имена кривых соответствуют стандартным обозначениям, таким как "prime256v1" или "secp384r1".

Базовые примеры вызова функции
Стандартное использование

Получение всего списка доступных кривых.

<?php
$curves = openssl_get_curve_names();
if ($curves === false) {
    echo 'Не удалось получить список кривых';
} else {
    print_r($curves);
}
Array
(
    [0] => secp112r1
    [1] => secp112r2
    [2] => secp128r1
    [3] => secp128r2
    [4] => secp160k1
    [5] => secp160r1
    [6] => secp160r2
    [7] => secp192k1
    [8] => prime192v1
    [9] => secp224k1
    [10] => secp224r1
    [11] => secp256k1
    [12] => prime256v1
    [13] => secp384r1
    [14] => secp521r1
    [15] => brainpoolP256r1
    [16] => brainpoolP384r1
    [17] => brainpoolP512r1
)
Получение первой доступной кривой
<?php
$curves = openssl_get_curve_names();
if (!empty($curves)) {
    echo 'Первая доступная кривая: ' . $curves[0];
}
Первая доступная кривая: secp112r1
Похожие функции в PHP

Прямых аналогов для получения списка эллиптических кривых в PHP нет. Однако, для работы с криптографией доступны другие функции модуля OpenSSL.

Функцию openssl_get_curve_names() применяют на этапе выбора параметров для генерации ключей, тогда как другие функции выполняют сами криптографические операции.

Типичные ошибки и проблемы
Отсутствие поддержки OpenSSL

Функция недоступна, если модуль OpenSSL не скомпилирован или отключен в PHP.

<?php
// Если модуль openssl отсутствует
$curves = openssl_get_curve_names();
var_dump($curves);
Fatal error: Uncaught Error: Call to undefined function openssl_get_curve_names()
Пустой результат в устаревших сборках

На некоторых старых или особо сконфигурированных сборках список может быть пустым.

<?php
$curves = openssl_get_curve_names();
if (empty($curves)) {
    echo 'Нет доступных эллиптических кривых.';
}
Нет доступных эллиптических кривых.

Для предотвращения проблем проверяют наличие функции и результат ее выполнения.

История изменений в версиях PHP

Функция openssl_get_curve_names() была добавлена в PHP 7.1. С момента своего появления она не претерпела значительных изменений в синтаксисе или поведении. В PHP 8.0 и 8.1 не было внесено модификаций, влияющих на ее работу. Стабильность функции обеспечивает ее предсказуемость в различных версиях.

Расширенные примеры использования
Фильтрация кривых по определенному параметру

Поиск кривых, относящихся к набору "secp".

Пример php
<?php
$curves = openssl_get_curve_names();
$filtered = array_filter($curves, function($curve) {
    return strpos($curve, 'secp') === 0;
});
print_r(array_values($filtered));
Array
(
    [0] => secp112r1
    [1] => secp112r2
    [2] => secp128r1
    [3] => secp128r2
    [4] => secp160k1
    [5] => secp160r1
    [6] => secp160r2
    [7] => secp192k1
    [8] => secp224k1
    [9] => secp224r1
    [10] => secp256k1
    [11] => secp384r1
    [12] => secp521r1
)
Проверка поддержки конкретной кривой перед генерацией ключа
Пример php
<?php
$desiredCurve = 'prime256v1';
$availableCurves = openssl_get_curve_names();

if (in_array($desiredCurve, $availableCurves)) {
    // Генерация ключа с использованием $desiredCurve
    $config = [
        "curve_name" => $desiredCurve,
        "private_key_type" => OPENSSL_KEYTYPE_EC,
    ];
    $keyPair = openssl_pkey_new($config);
    echo 'Ключ для кривой ' . $desiredCurve . ' успешно создан.';
} else {
    echo 'Кривая ' . $desiredCurve . ' не поддерживается.';
}
Ключ для кривой prime256v1 успешно создан.
Использование в контексте ECDH (Elliptic-curve Diffie–Hellman)

Получение списка кривых для настройки параметров обмена ключами.

Пример php
<?php
$curves = openssl_get_curve_names();
$strongCurves = [];
// Условный выбор кривых с размером больше 256 бит
foreach ($curves as $curve) {
    if (preg_match('/secp(\d+)r1/', $curve, $matches)) {
        if ($matches[1] >= 256) {
            $strongCurves[] = $curve;
        }
    }
}
echo 'Рекомендуемые кривые для ECDH: ' . implode(', ', $strongCurves);
Рекомендуемые кривые для ECDH: secp256k1, secp256r1, secp384r1, secp521r1
Аналоги в других языках программирования
Python (библиотека cryptography)

В Python используется библиотека cryptography. Прямого аналога для получения списка кривых может не быть, но имена кривых указываются напрямую при создании ключей.

from cryptography.hazmat.primitives.asymmetric import ec

# Выбор конкретной кривой при генерации ключа
private_key = ec.generate_private_key(ec.SECP256R1())
print(type(private_key))
<class 'cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePrivateKey'>
JavaScript (Node.js с модулем crypto)

В Node.js модуль crypto предоставляет методы для работы с ECDH, где также требуется указывать имя кривой.

const crypto = require('crypto');

// Создание объекта ECDH с конкретной кривой
alice = crypto.createECDH('prime256v1');
alice.generateKeys();
console.log('Ключ сгенерирован для кривой: prime256v1');
Ключ сгенерирован для кривой: prime256v1

В отличие от PHP, где можно получить весь список, в других языках имена кривых обычно указываются явно на основе документации.

PHP openssl_get_curve_names function comments

En
Openssl get curve names Gets list of available curve names for ECC