модуль OpenSSL::PKey
Асимметричные алгоритмы с открытым ключом
Асимметричные алгоритмы с открытым ключом решают проблему установления и обмена секретных ключей для шифрования/расшифровки сообщений. Ключ в таком алгоритме состоит из двух частей: открытого ключа, который можно распространить другим, и закрытого ключа, который должен оставаться секретным.
Сообщения, зашифрованные открытым ключом, могут быть расшифрованы только получателями, обладающими соответствующим закрытым ключом. Поскольку асимметричные алгоритмы значительно медленнее, чем симметричные алгоритмы (см. OpenSSL::Cipher), они часто используются для установления симметричного ключа между двумя сторонами, обладающими открытыми ключами друг друга.
Асимметричные алгоритмы предлагают множество полезных функций, используемых в различных областях. Очень распространённым применением является создание и проверка цифровых подписей. Для подписания документа подписывающий обычно использует алгоритм хэширования сообщений (см. OpenSSL::Digest) для вычисления хэша документа, который затем шифруется (т.е. подписывается) с использованием закрытого ключа. Любой, кто обладает открытым ключом, может проверить подпись, вычислив хэш исходного документа самостоятельно, расшифровав подпись с использованием открытого ключа подписывающего и сравнив результат с ранее вычисленным хэшем. Подпись считается действительной только в том случае, если расшифрованная подпись равна этому хэшу.
Модуль PKey поддерживает три популярных алгоритма с открытым и закрытым ключом:
-
Криптография эллиптических кривых (
OpenSSL::PKey::EC)
Каждая из этих реализаций фактически является подклассом абстрактного класса PKey, который предоставляет интерфейс для поддержки цифровых подписей в форме методов PKey#sign и PKey#verify.
Обмен ключами Диффи-Хэллмана
Наконец, PKey также включает OpenSSL::PKey::DH, реализацию протокола обмена ключами Диффи-Хэллмана, основанного на дискретных логарифмах в конечных полях, на котором также базируется DSA. Протокол Диффи-Хэллмана позволяет обмениваться (симметричными) ключами по небезопасным каналам без предварительного обмена информацией между участниками. Поскольку безопасность DH требует относительно длинных «открытых ключей» (т.е. части, явно передаваемой между участниками), DH имеет тенденцию быть довольно медленным. Если для вас первостепенны безопасность или скорость, OpenSSL::PKey::EC предлагает другую реализацию протокола Диффи-Хэллмана.
Методы публичного класса
static VALUE
ossl_pkey_s_generate_key(int argc, VALUE *argv, VALUE self)
{
return pkey_generate(argc, argv, self, 0);
} Генерирует новый ключ (пару).
Если в качестве первого аргумента передается String, генерируется новый случайный ключ для алгоритма, указанного именем, так же, как и при вызове ::generate_parameters. Если вместо этого передается OpenSSL::PKey::PKey, генерируется новый случайный ключ для того же алгоритма, что и у ключа, используя параметры, содержащиеся в ключе.
Подробности о параметрах options и передаваемом блоке см. в ::generate_parameters.
Пример
pkey_params = OpenSSL::PKey.generate_parameters("DSA", "dsa_paramgen_bits" => 2048)
pkey_params.priv_key #=> nil
pkey = OpenSSL::PKey.generate_key(pkey_params)
pkey.priv_key #=> #<OpenSSL::BN 6277...
static VALUE
ossl_pkey_s_generate_parameters(int argc, VALUE *argv, VALUE self)
{
return pkey_generate(argc, argv, self, 1);
} Генерирует новые параметры для алгоритма. algo_name — это String, представляющий алгоритм. Необязательный аргумент options — это Hash, который определяет параметры, специфичные для алгоритма. Порядок параметров может иметь значение.
Необязательно можно передать блок. Значение аргументов, передаваемых в блок, зависит от реализации алгоритма. Блок может быть вызван один раз или несколько раз, или вообще не вызываться.
Подробности о поддерживаемых параметрах см. в документации к утилите «openssl genpkey».
Пример
pkey = OpenSSL::PKey.generate_parameters("DSA", "dsa_paramgen_bits" => 2048)
p pkey.p.num_bits #=> 2048
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);
bio = ossl_obj2bio(&data);
pkey = ossl_pkey_read_generic(bio, ossl_pem_passwd_value(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 или io — зашифрованный PEM-ресурс.
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.