关于 c : 用 OpenSSL API 比较两个公钥 | 珊瑚贝

Comparing two public keys with OpenSSL API


我正在寻找一种方法来使用 C 中的 OpenSSL API 比较两个公钥。当然,最明显的方法是将两个密钥序列化为某种格式,如 PEM 或 DER,然后只比较两个序列化的缓冲区。

但我想知道是否有更有效的方法来比较直接使用内存中的 OpenSSL 密钥结构的两个密钥。显然,这样做可能需要不同的逻辑,具体取决于用于生成公钥(以及对应的私钥)的算法。

所以,从简单的开始,假设我们最初只关心比较 RSA 密钥。由于 RSA 密钥的公共部分是模数 n 和公共指数 e,看来我们可以尝试从每个密钥中获取这两个数字并直接比较它们。如果它们相等,我们可以说两个公钥相等。

OpenSSL API 提供了一个函数来获取这些值,RSA_get0_key,它返回指向存储在 RSA 结构中的内部 BIGNUM 对象 n、e 和 d 的指针。然后我们可以使用 BN_cmp 直接比较这些对象。所以 C 代码将类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 在概念上等同于检查两个公钥是否相同 – 但同样,我不是专家,所以我不确定这是否是正确的。

那么,我的方法正确吗?

  • 你为什么关心效率?您需要每秒比较数千个密钥吗?
  • 如果您问 (n1 == n2) && (e1 == e2) 是否意味着 k1 == k2(反之亦然),那么我认为 Cryptography SE 是一个更好的地方。如果这不是你要问的,那么你能更具体一点吗?


有一个名为 EVP_PKEY_cmp 的函数,它似乎可以做,你正在尝试做的事情。

参见 https://www.openssl.org/docs/man1.0.2/crypto/EVP_PKEY_cmp.html


来源:https://www.codenong.com/52601514/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9704.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?