openssl RSA_public_encrypt()返回的大小总是= RSA_size(rsa)?

时间:2012-12-17 04:48:58

标签: encryption cryptography openssl rsa

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

2 个答案:

答案 0 :(得分: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
  • 使用 K IV 使用AES-CBC(考虑填充)或AES-CTR加密到 E-DATA < / LI>
  • 使用SHA-256(或针对您的情况的任何合适的哈希算法)将加密数据 E-DATA 哈希到哈希 H
  • 使用RSA公钥加密 IV ,键 K 和哈希 H IV >可以公开同样,这通常更容易进入 E-RSA
  • 将加密数据 E-DATA 和加密的密钥数据 E-RSA 发送到另一方

另一方面:

  • E-RSA 解密为 IV K H (如果失败则退出)
  • 哈希 E-DATA 并使用 H 进行检查(如果失败则退出)
  • 解密 E-DATA IV K
  • 完成..

答案 1 :(得分:0)

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

如果您的输入仅增大,为什么不增加RSA密钥的大小?无论如何,你可以拥有2536位RSA密钥或3072位。