модуль 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.
Обмен ключами Диффи-Хеллмана
Наконец, 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.