我有一些明確的文本,我想使用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