Сравнение двух открытых ключей с OpenSSL API - PullRequest
0 голосов
/ 02 октября 2018

Я ищу способ сравнения двух открытых ключей с использованием 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 было бы концептуально эквивалентно проверке, были ли два открытых ключа одинаковыми - но, опять же, я не эксперт, поэтому я не уверен, что этоправильно.

Итак, мой подход здесь правильный?

1 Ответ

0 голосов
/ 02 октября 2018

Существует функция EVP_PKEY_cmp, которая, кажется, делает то, что вы пытаетесь сделать.

см. https://www.openssl.org/docs/man1.0.2/crypto/EVP_PKEY_cmp.html

...