Spec-Zone.ru › Ruby 3.1

модуль OpenSSL::PKey

Асимметричные алгоритмы с открытым ключом

Асимметричные алгоритмы с открытым ключом решают проблему установления и обмена секретными ключами для шифрования/расшифрования сообщений. Ключ в таких алгоритмах состоит из двух частей: открытый ключ, который может быть распространён среди других, и закрытый ключ, который должен оставаться секретным.

Сообщения, зашифрованные открытым ключом, могут быть расшифрованы только получателями, которые обладают соответствующим закрытым ключом. Поскольку алгоритмы с открытым ключом значительно медленнее, чем алгоритмы с симметричным ключом (см. OpenSSL::Cipher), они часто используются для установления симметричного ключа между двумя сторонами, которые обладают открытым ключом друг друга.

Асимметричные алгоритмы предлагают множество полезных функций, которые используются в различных областях. Очень распространённое применение — создание и проверка цифровых подписей. Для подписания документа подписывающий обычно использует алгоритм хеширования сообщений (см. OpenSSL::Digest) для вычисления хеша документа, который затем шифруется (т. е. подписывается) с помощью закрытого ключа. Любой, кто обладает открытым ключом, может проверить подпись, вычислив хеш исходного документа самостоятельно, расшифровав подпись с помощью открытого ключа подписывающего и сравнив результат с вычисленным хешем. Подпись действительна только в том случае, если расшифрованная подпись равна этому хешу.

Модуль PKey поддерживает три популярных алгоритма с открытым/закрытым ключом:

  • RSA (OpenSSL::PKey::RSA)

  • DSA (OpenSSL::PKey::DSA)

  • Криптография с эллиптическими кривыми (OpenSSL::PKey::EC)

Каждая из этих реализаций фактически является подклассом абстрактного класса PKey, который предоставляет интерфейс для поддержки цифровых подписей в виде PKey#sign и PKey#verify.

Обмен ключами Диффи-Хеллмана

Наконец, PKey также включает OpenSSL::PKey::DH, реализацию протокола обмена ключами Диффи-Хеллмана, основанную на дискретных логарифмах в конечных полях, на том же принципе, что и DSA. Протокол Диффи-Хеллмана может использоваться для обмена (симметричными) ключами по незащищённым каналам без предварительного совместного знания между участвующими сторонами. Поскольку безопасность DH требует относительно длинных «открытых ключей» (т. е. части, которая открыто передаётся между участниками), DH может быть довольно медленным. Если для вас приоритетны безопасность или скорость, OpenSSL::PKey::EC предлагает другую реализацию протокола Диффи-Хеллмана.

Методы открытого класса

OpenSSL::PKey.generate_key(algo_name [, options]) → pkey Показать исходный код
OpenSSL::PKey.generate_key(pkey [, options]) → pkey
static VALUE
ossl_pkey_s_generate_key(int argc, VALUE *argv, VALUE self)
{
    return pkey_generate(argc, argv, self, 0);
}

Генерирует новый ключ (пару).

Если в качестве первого аргумента передаётся String, генерируется новый случайный ключ для алгоритма, заданного именем, так же, как и в ::generate_parameters. Если вместо этого передаётся OpenSSL::PKey::PKey, генерируется новый случайный ключ для того же алгоритма, что и у ключа, используя параметры, содержащиеся в ключе.

См. ::generate_parameters для получения подробностей о параметрах options и переданном блоке.

Пример

pkey_params = OpenSSL::PKey.generate_parameters("DSA", "dsa_paramgen_bits" => 2048)
pkey_params.priv_key #=> nil
pkey = OpenSSL::PKey.generate_key(pkey_params)
pkey.priv_key #=> #<OpenSSL::BN 6277...
OpenSSL::PKey.generate_parameters(algo_name [, options]) → pkey Показать исходный код
static VALUE
ossl_pkey_s_generate_parameters(int argc, VALUE *argv, VALUE self)
{
    return pkey_generate(argc, argv, self, 1);
}

Генерирует новые параметры для алгоритма. algo_name — это String, представляющий алгоритм. Необязательный аргумент options — это Hash, который задаёт параметры, специфичные для алгоритма. Порядок параметров может быть важен.

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

Для поддерживаемых параметров см. документацию для утилиты «openssl genpkey».

Пример

pkey = OpenSSL::PKey.generate_parameters("DSA", "dsa_paramgen_bits" => 2048)
p pkey.p.num_bits #=> 2048
OpenSSL::PKey.read(string [, pwd ]) → PKey Показать исходный код
OpenSSL::PKey.read(io [, pwd ]) → PKey
static VALUE
ossl_pkey_new_from_data(int argc, VALUE *argv, VALUE self)
{
    EVP_PKEY *pkey;
    BIO *bio;
    VALUE data, pass;

    rb_scan_args(argc, argv, "11", &data, &pass);
    bio = ossl_obj2bio(&data);
    pkey = ossl_pkey_read_generic(bio, ossl_pem_passwd_value(pass));
    BIO_free(bio);
    if (!pkey)
        ossl_raise(ePKeyError, "Could not parse PKey");
    return ossl_pkey_new(pkey);
}

Читает закодированную в DER или PEM строку из string или io и возвращает экземпляр соответствующего класса PKey.

Параметры

  • string — это строка DER или PEM, содержащая произвольный закрытый или открытый ключ.

  • io — экземпляр IO, содержащий закодированный в DER или PEM произвольный закрытый или открытый ключ.

  • pwd — необязательный пароль в случае, если string или io является зашифрованным PEM-ресурсом.

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API