我想要使用RSA_PKCS_V21(使用PolarSSL库)加密一些明文。问题是我需要在执行算法之前知道密文的大小(用于动态内存分配目的)。
我知道RSA密钥大小&明文长度。
我也想知道输入明文长度的限制
有什么想法吗?
答案 0 :(得分:12)
只需查看RSA PKCS#1 v2.1 standard, chapter 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填充,可以在chapter 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 - 比非对称加密快得多。这种组合称为hybrid encryption。
使用任何填充的RSA加密或签名生成的输出大小与模数的字节数相同(当然向上舍入),因此对于1024位密钥,您会期望1024 / 8 = 128个八位字节/字节。
请注意,计算大小的输出数组可能包含设置为零的前导字节;这应该被认为是正常的。