【问题标题】:openssl RSA_public_encrypt() returned size always = RSA_size(rsa)?openssl RSA_public_encrypt() 返回的大小总是 = RSA_size(rsa)?
【发布时间】:2012-12-17 04:48:58
【问题描述】:

RSA_size(rsa) 在我的应用程序中返回等于 256 的模数。 我正在使用RSA_PKCS1_OAEP_PADDING 选项加密数据,因此发送到RSA_public_encrypt() 的输入缓冲区的最大长度为 256 - 41 = 215

在某些情况下,我的输入缓冲区的长度可能会超出 215 的限制,我需要多次调用 RSA_public_encrypt()

我的问题是关于RSA_public_encrypt()的返回值。

根据我的测试,返回值为 256(等于 RSA_size(rsa)), doc 还说:

RSA_public_encrypt() 返回加密数据的大小(即, RSA_size(rsa))。

我只是想确保RSA_public_encrypt()的返回值只有两种可能。

-1 (error)modulus(success),没有其他可能,是吗? 我很好奇,因为我需要划分加密缓冲区并为每个块调用RSA_private_decrypt()。如果每个RSA_public_encrypt的加密缓冲区相同,那么我不需要为每个人存储大小。

【问题讨论】:

    标签: encryption cryptography openssl rsa


    【解决方案1】:

    对于所有当前已知的 PKCS#1 加密模式,RSA_public_encrypt() 的(正)返回将始终与 RSA_size(rsa) 相同。

    简而言之:您当前的假设是正确的。

    实际上:如果您有大于 RSA_size(rsa) 的数据并将其拆分为块,您可能应该考虑使用随机对称密钥加密数据并使用 RSA_public_key() 加密该密钥。 RSA 公钥加密不适用于更大的数据块。

    加密大于 RSA_size(rsa) - XX(其中 XX 取决于所使用的 PKCS#1 模式)的最佳方法:

    • 生成 16 个字节的随机 IV(应该是唯一的)
    • 生成 32 字节(256 位)的随机密钥 K
    • 使用 KIV 使用 AES-CBC(考虑填充)或 AES-CTR 将数据加密到 E-DATA
    • 使用 SHA-256(或任何适合您情况的哈希算法)将加密数据 E-DATA 散列成散列 H
    • 使用 RSA 公钥加密 IV、密钥 K 和散列 HIV 可以是公开的也可以,但这通常更容易)到 E-RSA
    • 将加密数据E-DATA和加密密钥数据E-RSA发送到另一端

    另一边:

    • E-RSA 解密为 IVKH(如果失败则退出)李>
    • 散列 E-DATA 并使用 H 进行检查(如果失败则退出)
    • 使用 IVK 解密 E-DATA
    • 完成..

    【讨论】:

    • 在这种情况下,更好的办法是使用经过验证且已建立的方案,如 CMS,OpenSSL 也支持该方案。这是轮子的重新发明。
    • @NickolayO。这是一个比你的答案更好的答案,我感觉你对它投了反对票。如果您认为提问者更适合 CMS,然后将其发布为答案
    • 我对这个答案的质量有另一种看法,但是我也不认为我的答案是理想的。
    • @NickolayO 我同意在大多数情况下使用已建立的方案(例如 CMS)是件好事。不是每个人都可以在双方都使用 OpenSSL。由于 ASN.1 编码,在 OpenSSL 之外执行 CMS 是一种安静的体验。所以是的,我同意。如果可以的话,请使用 CMS..
    • 您不需要自己实现 CMS/OpenPGP,有很多库可用于几乎任何语言。而且,OpenSSL 可用于所有平台(以及 GnuPG)。
    【解决方案2】:

    RSA_encrypt() 的输出可能包含一些前导零位,我不确定 openssl 是否保留它们。切割它们将导致输出,它短一个字节。 这种情况很少发生。

    如果您的输入只是稍微大一点,为什么不增加 RSA 密钥的大小呢?您可以拥有 2536 位 RSA 密钥或 3072 位,等等。

    【讨论】:

    • 他们很可能使用BN_bn2bin,它只为正的“大数”定义。增加尺寸是一种选择,但您必须提前知道最大尺寸。与生成对称密钥相比,它的灵活性和速度要慢得多(当然,这取决于安全随机生成器的速度)——而且我的意思是 exponential 在与密钥大小相关时会变慢。
    • 当然最好使用已知的混合对称/非对称方案,如 OpenPGP 或 CMS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多