如何使用密钥大小和明文长度计算RSA密文的大小?



我有一些明文,我想使用RSA_PKCS_V21(使用PolarSSL库)对其进行加密。问题是,在执行算法之前,我需要知道密文的大小(出于动态内存分配的目的)。我知道RSA密钥大小&明文长度
我也想知道输入明文长度的限制
知道吗?

只需查看RSA PKCS#1 v2.1标准,第7.2章:

RSAES-PKCS1-V1_5-ENCRYPT((n,e),M)

输入:

  • (n,e)接收方的RSA公钥(k表示以八位字节为单位的长度模量n)
  • M消息、长度为mLen的八位字节串,其中mLen<=k-11

因此,输入取决于键的大小。k是该密钥大小,但以八位字节为单位。因此,对于1024位密钥,最大纯文本为1024/8-11=117字节。


请注意,上面是使用PKCS#1 v1.5填充的RSA的最大大小。对于较新的OAEP填充,可以在第7.1章中找到以下内容:

RSAES-OAEP-ENCRYPT((n,e),M,L)

输入:

  • (n,e)接收方的RSA公钥(k表示以八位字节为单位的长度RSA模数n)
  • M消息、长度为mLen的八位字节串,其中mLen<=k-2hLen-2
  • L与消息关联的可选标签;这个如果未提供L,则L的默认值为空字符串

其中hLen是用于掩码生成函数的哈希函数的输出大小。如果使用默认的SHA-1散列函数,则消息的最大大小为k-42(因为SHA-1的输出大小为20字节,2*20+2=42)。


通常情况下,会对随机生成的密钥进行加密,而不是对消息进行加密。然后使用该密钥对消息进行加密。这允许几乎无限长的消息,对称加密(如CBC模式下的AES)比非对称加密快得多。这种组合称为混合加密。


使用任何填充的RSA加密或签名生成的输出大小与模数的大小相同(以字节为单位)(当然是向上取整),因此对于1024位密钥,您期望1024/8=128个八位字节/字节。

注意,计算出的大小的输出数组可以包含设置为零的前导字节;这应该被认为是正常的。

最新更新