модуль 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 предлагает другую реализацию протокола Диффи-Хеллмана.
Методы публичного класса
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 строку из строки или потока и возвращает экземпляр соответствующего класса PKey.
Параметры
-
строка — это закодированная в DER или PEM строка, содержащая произвольный закрытый или открытый ключ.
-
поток — это экземпляр
IO, содержащий закодированный в DER или PEM произвольный закрытый или открытый ключ. -
пароль — это необязательный пароль, если строка или поток представляют собой зашифрованный PEM-ресурс.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.