【问题标题】:Are private key and public key extracted from key pair are of same length using openssl使用openssl从密钥对中提取的私钥和公钥是否具有相同的长度
【发布时间】:2016-01-29 06:41:33
【问题描述】:

当以下函数用于生成 1024 位的 RSA 密钥对时。

rsa_key = RSA_generate_key ( 1024, 3, NULL, NULL );

keyPair = BIO_new ( BIO_s_mem ( ) );

PEM_write_bio_RSAPrivateKey(keyPair, rsa_key, NULL, NULL, 0, NULL, NULL);

keyPair_len = BIO_pending(keyPair);

那么得到的keyPair_len不是1024,是882。 减少的原因是什么。

通过使用 RSA_generate_key() 函数,我们是生成密钥对还是仅生成私钥。 如果是这样,当我们从中提取私钥和公钥时,它会生成不同长度的私钥和公钥。

evp_key = EVP_PKEY_new();
ret = EVP_PKEY_assign_RSA ( evp_key, rsa_key );
pri = BIO_new ( BIO_s_mem ( ) );
pub = BIO_new ( BIO_s_mem ( ) );

PEM_write_bio_PrivateKey ( pri, evp_key, NULL, NULL, 0, NULL, NULL );
PEM_write_bio_PUBKEY ( pub, evp_key );

pri_len = BIO_pending(pri);
pub_len = BIO_pending(pub);

pri_len pub_len 的长度分别为 916 和 272。 任何人都可以帮助理解为什么会这样吗?

【问题讨论】:

    标签: openssl cryptography


    【解决方案1】:

    您生成模数大小为 1024 bits 而不是 bytes 的 RSA 密钥。私钥基本上包含公钥信息,因此在任何表示(无论是 DER 还是 PEM)中都会更大。

    您获得的结果不是这些模数大小,而是它们在 PEM 中编码的 ASN.1 结构的大小。甚至-----BEGIN PUBLIC KEY----- 的东西。

    更多信息在这里: https://tls.mbed.org/kb/cryptography/asn1-key-structures-in-der-and-pem

    【讨论】:

    • 我想补充一点,将 unbalanced 密钥用于 RSA 密钥对并不少见。这意味着公钥和私钥不必相同大小。这使您在速度方面进行了权衡:拥有更大的私钥使得签名比验证签名的计算成本更高。这背后的基本原理是您对一条数据进行一次签名,但通常会更频繁地执行验证。鉴于足够大的安全裕度,不平衡密钥的暴力分解也不应该造成问题。
    猜你喜欢
    • 2017-12-18
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多