Spec-Zone.ru › Ruby 2.4

модуль OpenSSL::PKey

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

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

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

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

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

  • RSA (OpenSSL::PKey::RSA)

  • DSA (OpenSSL::PKey::DSA)

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

Каждая из этих реализаций фактически является подклассом абстрактного класса PKey, который предоставляет интерфейс для поддержки цифровых подписей в виде OpenSSL::PKey::PKey#sign и OpenSSL::PKey::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))) {
        OSSL_BIO_reset(bio);
        if (!(pkey = PEM_read_bio_PrivateKey(bio, NULL, ossl_pem_passwd_cb, (void *)pass))) {
            OSSL_BIO_reset(bio);
            if (!(pkey = d2i_PUBKEY_bio(bio, NULL))) {
                OSSL_BIO_reset(bio);
                pkey = PEM_read_bio_PUBKEY(bio, NULL, ossl_pem_passwd_cb, (void *)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 или file представляет собой зашифрованный ресурс PEM.

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

Spec-Zone.ru

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