Encryption openssl RSA\u public\u encrypt()返回的大小始终=RSA\u大小(RSA)?

Encryption openssl RSA\u public\u encrypt()返回的大小始终=RSA\u大小(RSA)?,encryption,cryptography,openssl,rsa,Encryption,Cryptography,Openssl,Rsa,RSA\u size(RSA)在我的应用程序中返回等于256的模。 我使用RSA\u PKCS1\u OAEP\u PADDING选项加密数据,因此发送到RSA\u public\u encrypt()的输入缓冲区的最大长度为256-41=215 在某些情况下,输入缓冲区的长度可能会超过215限制一点,我需要多次调用RSA\u public\u encrypt() 我的问题是关于RSA\u public\u encrypt()的返回值 从我的测试中,返回值是256(等于RSA\u size(RS

RSA\u size(RSA)
在我的应用程序中返回等于256的模。 我使用
RSA\u PKCS1\u OAEP\u PADDING
选项加密数据,因此发送到
RSA\u public\u encrypt()
的输入缓冲区的最大长度为256-41=215

在某些情况下,输入缓冲区的长度可能会超过215限制一点,我需要多次调用
RSA\u public\u encrypt()

我的问题是关于
RSA\u public\u encrypt()
的返回值

从我的测试中,返回值是256(等于
RSA\u size(RSA)
), 该报告还说:

RSA_public_encrypt()返回加密数据的大小(即。, RSA_大小(RSA))

我只想确保
RSA\u public\u encrypt()
的返回值只有两种可能

-1(错误)模数(成功),并且没有其他可能性,是吗? 我很好奇,因为我需要分割加密的缓冲区,并为每个块调用
RSA\u private\u decrypt()
。如果每个
RSA\u public\u encrypt
的加密缓冲区相同,则我不需要存储每个缓冲区的大小。

RSA\u public\u encrypt()的(正)返回值将始终与PKCS\35; 1加密的所有当前已知模式的RSA\u大小(RSA)相同

简言之,你目前的假设是正确的

但实际上:如果您的数据大于RSA_大小(RSA),并且要将其拆分为块,则可能应该考虑使用随机对称密钥加密数据,并使用RSA_公钥()加密该密钥。RSA公钥加密不适用于较大的数据块

加密大于RSA#u 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
  • 完成

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


如果您的输入只稍微大一点,为什么不增加RSA密钥的大小呢?您可以使用2536位的RSA密钥或3072位的RSA密钥,或者其他任何密钥。

很可能他们使用的是
BN_bn2bin
,该密钥仅定义为正数“大数”。增大尺寸是一种选择,但您必须事先知道最大尺寸。它比生成对称密钥灵活得多,速度也慢得多(当然,这取决于安全随机生成器的速度)-对于较慢,我指的是与密钥大小相关的指数减速。当然,使用已知的对称/非对称混合方案(如OpenPGP或CMS)要好得多。在这种情况下,更好的方法是使用经验证有效且已建立的方案,如CMS,它也受OpenSSL支持。“这是车轮的重新发明。”尼科拉约。这是一个比你的好得多的答案,我感觉你否决了它。如果你认为提问者更适合CMS,那么将其作为答案发布。我对这个答案的质量有另一种看法,但我也不认为我的答案是理想的。@NickolayO我同意在大多数情况下使用已建立的方案(如CMS)是好的。不是每个人都可以在双方都使用OpenSSL。由于ASN.1编码,在OpenSSL之外实现CMS是一种可怕的体验。所以,是的,我同意。尽可能使用CMS。你不需要自己实现CMS/OpenPGP,几乎任何语言都有很多可用的库。而且,OpenSSL可用于所有平台(以及GnuPG)。