我有一些明确的文本,我想使用RSA_PKCS_V21(使用PolarSSL库)进行加密。问题是我需要在执行算法之前知道密文的大小(用于动态内存分配目的)。 我知道RSA密钥大小&明文的长度。
我也想知道输入明文长度的限制。
有什么想法?如何使用密钥大小和明文长度来计算RSA密文的大小?
9
A
回答
12
只需选中RSA PKCS#1 v2.1 standard, chapter 7.2:
RSAES-PKCS1-v1_5中加密((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的八位位组 的长度)
- 中号消息被加密,升的八位组串其中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个八比特组/字节。
请注意,计算大小的输出数组可能包含设置为零的前导字节;这应该被认为是正常的。
相关问题
- 1. .NET RSA加密:最小密钥大小?
- 2. TLS 1.2 - 密钥对大小和加密密钥长度
- 3. 大密钥大小的加密算法
- 4. RSA的最小密钥长度
- 5. 加密密钥大小和算法
- 6. RSA“长度必须等于密钥大小”错误
- 7. 如何设置使用aspnet_regiis创建的RSA密钥的密钥大小?
- 8. 具有大密钥大小的RSA加密
- 9. 使用大于密钥大小的密钥加密消息
- 10. 试图了解Java RSA密钥大小
- 11. Python的加密库 - ValueError异常:密文长度必须等于密钥大小
- 12. 如何使用java查找SSH RSA密钥的密钥长度
- 13. iPhone - 使用SecKeyGeneratePair的iOS RSA算法中的最小密钥大小(InBits)
- 14. RSA加密输出大小
- 15. 使用公钥进行RSA加密。基于密钥的数据大小
- 16. 为什么RSA加密和解密的时间取决于密钥大小而不是输入长度?
- 17. Visa RSA密钥长度
- 18. SHA512哈希算法的密钥大小
- 19. Java中小于512位的RSA密钥大小
- 20. RSA解密后AES密钥大小无效
- 21. InnoDB最大密钥长度
- 22. mcrypt_encrypt():密钥的大小为
- 23. 使用加密算法获取常量密钥大小
- 24. 加密++ RSA公钥加密与长明文
- 25. 最小证书密钥长度和WinXP
- 26. .NET DSACryptoServiceProvider密钥大小
- 27. DESedeKeySpec错误密钥大小
- 28. InvalidKeyException:非法密钥大小
- 29. 非法密钥大小
- 30. 字典/ hash_map密钥大小
这是一个相当古老的问题,但是因为我在研究问题的一部分时偶然发现了这个问题:我认为这个答案不能回答整个问题,它也会要求预期的*密文*的大小,不仅仅是对输入大小的限制。即给定2048位的RSA密钥,给定特定的明文消息时产生的*密文*有多大?你的回答没有解决这个问题(或者我错过了)。 – malexmave 2017-10-31 18:31:38
@malexmave在答案中增加了另一节。忘了它,因为它是显而易见的。 **警告** 1024位密钥大小只是一个例子,强烈建议使用2048位密钥或更高的密钥。 – 2017-10-31 18:42:01