2

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)),文档还说:

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

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

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

4

2 回答 2

11

对于所有当前已知的 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
  • 使用 AES-CBC(考虑填充)或 AES-CTR 使用KIV加密数据到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
  • 完毕..
于 2012-12-17T07:50:03.547 回答
0

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

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

于 2012-12-17T09:31:09.447 回答