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

Mr.*_*oor 2 encryption openssl cryptography rsa

RSA_size(rsa)返回模数,在我的应用程序中等于256.我用RSA_PKCS1_OAEP_PADDING选项加密数据,所以发送的输入缓冲区的最大长度RSA_public_encrypt()是256 - 41 = 215

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

我的问题是关于的回报价值RSA_public_encrypt().

从我的测试中返回值是256(等于RSA_size(rsa)),文档还说:

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

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

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

小智 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和哈希H(IV也可以公开,但这通常更容易)到E-RSA
  • 将加密数据E-DATA和加密密钥数据E-RSA发送到另一方

另一方面:

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