关于 c : 用 OpenSSL API 比较两个公钥
Comparing two public keys with OpenSSL API
我正在寻找一种方法来使用 C 中的 OpenSSL API 比较两个公钥。当然,最明显的方法是将两个密钥序列化为某种格式,如 PEM 或 DER,然后只比较两个序列化的缓冲区。
但我想知道是否有更有效的方法来比较直接使用内存中的 OpenSSL 密钥结构的两个密钥。显然,这样做可能需要不同的逻辑,具体取决于用于生成公钥(以及对应的私钥)的算法。
所以,从简单的开始,假设我们最初只关心比较 RSA 密钥。由于 RSA 密钥的公共部分是模数
OpenSSL API 提供了一个函数来获取这些值,
|
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) { const BIGNUM* n1; RSA_free(rsa1); return false; |
我的问题:这种方法有意义吗?我绝不是密码学专家,而且我对 RSA 密钥的工作原理有非常基本的了解,所以我不知道我的方法是否有问题。我的理解是,给定两个 RSA 密钥对,比较每个
那么,我的方法正确吗?
相关讨论
- 你为什么关心效率?您需要每秒比较数千个密钥吗?
-
如果您问
(n1 == n2) && (e1 == e2) 是否意味着k1 == k2 (反之亦然),那么我认为 Cryptography SE 是一个更好的地方。如果这不是你要问的,那么你能更具体一点吗?
有一个名为 EVP_PKEY_cmp 的函数,它似乎可以做,你正在尝试做的事情。
参见 https://www.openssl.org/docs/man1.0.2/crypto/EVP_PKEY_cmp.html