Rsa

我正在對隨機創建的 AES 密鑰進行 RSA 加密。我需要為 RSA 填充嗎?

  • November 28, 2022

似乎有兩種使用 .Net 進行 RSA 加密的方法:

EncryptValue(它似乎沒有填充明文)。

加密(這樣做)。

我想知道,因為我正在加密的是加密安全(咳嗽…)AES 密鑰,我是否需要用官方填充方案填充它?當然,假設數據(AES 密鑰)的長度恰好是正確的長度,或者用一些簡單的東西填充,例如零。

是的,你需要填充,因為沒有填充

  1. 如果公共指數電子 $ e $ 低於某個門檻值,則通過電子日 $ e^\text{th} $ 根攻擊或其擴展解密是微不足道的。我們甚至不確定什麼是安全門檻值(參見this),但這取決於 AES 密鑰和 RSA 公共模數的大小。
  2. 如果您將相同的加密密鑰發送給至少電子 $ e $ 個收件人(每個收件人都有他們的公鑰),Håstad 的廣播攻擊適用。如果明文空間受限,這種攻擊可以擴展到更少的接收者,我也不會太驚訝。
  3. 從密碼中,對手能夠測試對 AES 密鑰的猜測,並測試它是否與另一個會話中的相同。
  4. 如果接收方檢查解密結果是否低於2個k $ 2^k $ ,其中k $ k $ 是預期的 AES 密鑰大小(而不是僅保留解密結果的低位k $ k $ 位以形成密鑰),並且這樣做會引入一個時間依賴於教科書 RSA 解密結果的位大小(這在任何語言中都很容易被忽略),那麼它們就有可能容易受到允許解密密鑰的時間攻擊。

推薦的填充是RSAES-OAEP,它解決了 1/2/3 問題,仔細實施後解決了 4 問題。

[題外話:整個事情甚至在 .NET 中預先打包為RSAOAEPKeyExchangeFormatterRSAOAEPKeyExchangeDeformatter ]。

添加:另一種選擇是RSA-KEM。簡而言之:您生成一個與公鑰模數一樣寬的秘密,用教科書 RSA(無填充)對其進行加密,雙方都保留適當的低位作為 AES 密鑰。只要有一個 recipient,針對 1/3/4 的安全性就非常好:它依賴於 RSA 的最基本(推測的)安全屬性,以及 RSA 實現的必要安全屬性(這是沒有保險的!) . 但是 KEM 並不能解決 2,而且對於多個接收者來說也不方便。

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