Rsa

Java 在使用 RSA 時是否會忽略轉換模式和填充?

  • November 8, 2016

考慮 GregS 對這個問題的評論(更具體到 bouncycastle 的提供者實現):

https://stackoverflow.com/questions/11717646/bouncycastle-rsa-key-size-and-padding

在這種情況下,模式(ECB)對於 RSA 被忽略。使用 PKCSPadding。您可以加密的最大數據量是模數的大小(以字節為單位)減去 11。

我讀過幾篇似乎表達類似觀點的文章,包括這篇文章:

http://armoredbarista.blogspot.com/2012/09/rsaecb-how-block-operation-modes-and.html

儘管那篇文章似乎提出了僅當數據超過模數大小時才忽略它的情況。

基本上我有少量數據要加密(使用者名和密碼),一個 2048 位密鑰長度的私鑰,我使用 RSA/ECB/PKCS1Padding 密碼轉換進行加密。這在 Java 中被認為是“教科書”還是“普通”RSA?

我相信我正在使用一種安全的方法來滿足我們的需求,但我需要確定。

ECB、CBC 和此類密碼模式與對稱密碼學有關。在 RSA 的上下文中,重要的是從產品文件中研究它們的含義,因為它們通常不適用。

根據您提供的文章,此陳述是正確的:

在這種情況下,模式(ECB)對於 RSA 被忽略。使用 PKCSPadding。您可以加密的最大數據量是模數的大小(以字節為單位)減去 11。

PKCS#1 標准定義了許多填充方案。該方案和填充的更精細和更明確的名稱是RSAES-PKCS1-v1_5。您只需要確保您打算加密的數據最多為 245 字節。


通常警告不要使用教科書 RSA。這個警告實際上意味著“不要在不使用填充方案的情況下使用 RSA”。因此,帶有任何來自 PKCS#1 的填充的 RSA 都不是教科書 RSA。

安全的?

在大多數協議中,使用帶有 PKCS#1 填充的 RSA 加密的是密鑰。加密使用者名和密碼的情況明顯不太常見。安全地使用 RSAES-PKCS1-v1_5 需要在應用程序中小心謹慎。長話短說,這種填充方案可能無法滿足這種用途的需求。但是,由於我不知道應用的上下文和其他算法,我不知道這在這種情況下是否安全。

RSA 加密的目的是確保僅由有權訪問私鑰的一方執行解密。RSA 加密不對發送者進行身份驗證,任何人都可以發送一條就 RSA 和填充方案而言看起來正確的消息。

如果需要發件人身份驗證(很常見),則必須使用數字簽名方案,例如RSASSA-PKCS1-v1_5與加密算法結合使用。

有一個更新的填充方案(Optimal Asymmetric Encryption Padding),它解決了 RSAES-PKCS1-v1_5 的一些結果。但是,作為一般建議,我建議您嘗試找到一個安全協議,該協議將實現您擁有的整個安全案例。從像RSA/ECB/PKCS1Padding這樣的小塊實現任何實用的安全協議都是乏味的,不幸的是容易出錯。

引用自:https://crypto.stackexchange.com/questions/11635