Spec-Zone.ru › Ruby 3

модуль OpenSSL::PKey

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

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

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

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

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

  • RSA (OpenSSL::PKey::RSA)

  • DSA (OpenSSL::PKey::DSA)

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

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

Обмен ключами Diffie-Hellman

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

Методы публичного класса

OpenSSL::PKey.read(строка [, пароль ]) → PKey Показать исходный код
OpenSSL::PKey.read(поток [, пароль ]) → 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);
    pass = ossl_pem_passwd_value(pass);

    bio = ossl_obj2bio(&data);
    if ((pkey = d2i_PrivateKey_bio(bio, NULL)))
        goto ok;
    OSSL_BIO_reset(bio);
    if ((pkey = d2i_PKCS8PrivateKey_bio(bio, NULL, ossl_pem_passwd_cb, (void *)pass)))
        goto ok;
    OSSL_BIO_reset(bio);
    if ((pkey = d2i_PUBKEY_bio(bio, NULL)))
        goto ok;
    OSSL_BIO_reset(bio);
    /* PEM_read_bio_PrivateKey() also parses PKCS #8 formats */
    if ((pkey = PEM_read_bio_PrivateKey(bio, NULL, ossl_pem_passwd_cb, (void *)pass)))
        goto ok;
    OSSL_BIO_reset(bio);
    if ((pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)))
        goto ok;

    BIO_free(bio);
    ossl_raise(ePKeyError, "Could not parse PKey");

ok:
    BIO_free(bio);
    return ossl_pkey_new(pkey);
}

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

Параметры

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

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

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

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

Spec-Zone.ru

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