Я ищу способ сравнения двух открытых ключей с использованием API OpenSSL в C ++.Конечно, наиболее очевидным способом было бы сериализовать оба ключа в некоторый формат, такой как PEM или DER, а затем просто сравнить два сериализованных буфера.
Но мне интересно, есть ли более эффективный способ сравнениядва ключа, которые напрямую используют структуры ключей OpenSSL в памяти.Очевидно, что для этого, вероятно, потребуется другая логика в зависимости от того, какой алгоритм использовался для генерации открытого ключа (вместе с его частным аналогом.)Ключи RSA.Поскольку открытый компонент ключа RSA является модулем n
и открытым показателем e
, кажется, что мы могли бы просто попытаться получить эти два числа из каждого ключа и просто сравнить их напрямую.Если они равны, мы можем сказать, что два открытых ключа равны.
API-интерфейс OpenSSL предоставляет функцию для получения этих значений RSA_get0_key
, которая возвращает указатели на внутренние BIGNUM
объекты n
, e
и d
,хранится в структуре RSA
.Затем мы можем использовать BN_cmp
для непосредственного сравнения этих объектов.Таким образом, код C ++ будет выглядеть примерно так:
bool compare_pubkeys(const EVP_PKEY* k1, const EVP_PKEY* k2)
{
// make sure both keys are the same type
const int tp1 = EVP_PKEY_type(k1->type);
const int tp2 = EVP_PKEY_type(k2->type);
if (tp1 != tp2) return false;
if (tp1 == EVP_PKEY_RSA) {
RSA* rsa1 = EVP_PKEY_get1_RSA(k1);
RSA* rsa2 = EVP_PKEY_get1_RSA(k2);
const BIGNUM* n1;
const BIGNUM* e1;
const BIGNUM* n2;
const BIGNUM* e2;
RSA_get0_key(rsa1, &n1, &e1, nullptr);
RSA_get0_key(rsa2, &n2, &e2, nullptr);
const bool result = BN_cmp(n1, n2) == 0 && BN_cmp(e1, e2) == 0;
RSA_free(rsa1);
RSA_free(rsa2);
return result;
}
else { /* handle non-RSA keys later */ }
return false;
}
Мой вопрос : имеет ли этот подход смысл?Я ни в коем случае не эксперт в криптографии, и у меня есть чрезвычайно базовое понимание того, как работают ключи RSA, поэтому я не знаю, если что-то не так с моим подходом.Насколько я понимаю, учитывая две пары ключей RSA, сравнение каждой n
и e
было бы концептуально эквивалентно проверке, были ли два открытых ключа одинаковыми - но, опять же, я не эксперт, поэтому я не уверен, что этоправильно.
Итак, мой подход здесь правильный?