модуль OpenSSL::PKey
Асимметричные алгоритмы с открытым ключом
Асимметричные алгоритмы с открытым ключом решают проблему установления и обмена секретными ключами для шифрования/расшифровки сообщений. Ключ в таком алгоритме состоит из двух частей: открытый ключ, который можно распространять другим, и закрытый ключ, который должен оставаться в секрете.
Сообщения, зашифрованные с использованием открытого ключа, могут быть расшифрованы только получателями, обладающими соответствующим закрытым ключом. Поскольку асимметричные алгоритмы значительно медленнее, чем симметричные алгоритмы (см. OpenSSL::Cipher), их часто используют для установления симметричного ключа между двумя сторонами, которые обладают открытым ключом друг друга.
Асимметричные алгоритмы предлагают множество полезных функций, используемых в различных областях. Очень распространённое применение — создание и проверка цифровых подписей. Для подписания документа подписывающий обычно использует алгоритм хеширования (см. OpenSSL::Digest), чтобы вычислить хеш документа, который затем шифруется (т.е. подписывается) с использованием закрытого ключа. Любой, кто обладает открытым ключом, может проверить подпись, вычислив хеш исходного документа самостоятельно, расшифровав подпись с использованием открытого ключа подписывающего и сравнив результат с ранее вычисленным хешем. Подпись действительна тогда и только тогда, когда расшифрованная подпись равна этому хешу.
Модуль PKey поддерживает три популярных алгоритма с открытым/закрытым ключом:
-
Криптография с эллиптическими кривыми (
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.
Публичные методы класса
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.