Rsa

使用 RSA-OAEP 執行 RSA-KEM

  • May 8, 2018

我正在擺弄 JS Web Crypto API 並創建一個混合加密系統,該系統使用對稱密鑰使用 AES256-CBC 加密表單數據,並使用公鑰/私鑰對使用 RSA-OAEP 包裝/封裝對稱密鑰。

目前我只是生成一個隨機的 256 位密鑰,它將被 RSA-OAEP 填充和包裝。

我在 RFC 5990 中偶然發現了 RSA-KEM,並且喜歡我可以通過 HKDF 從中獲取加密密鑰和 iv(以及許多其他密鑰)的事實。HKDF 是 Web Crypto API 中受支持的算法,但 RSA-KEM 說我應該使用沒有任何填充的“簡單 RSA”來加密用於密鑰派生的隨機元素,這令人驚訝的是 W3C 規範中沒有提到的算法。

我可以使用 RSA-OAEP 加密用於密鑰派生的隨機元素(甚至不需要填充)還是有任何安全問題?我應該堅持我目前的實施嗎?

如果您擁有的是計算 RSAES-OAEP 的機器而不是計算的機器 $ x \mapsto x^e \bmod n $ ,您實際上並沒有執行 RSA-KEM 的工具。 你最好先做你正在做的事情——除非我可以說服你不要在沒有有意義的指導(即 WebCrypto API)的情況下靠近歇斯底里葡萄乾的不連貫雷區。

現在,在技術上可以濫用 RSAES-OAEP 來模擬 RSA-KEM 實現。它甚至可能與任何一方的 RSA-KEM 實現兼容,但您真的不應該嘗試使用 RSAES-OAEP 模擬 RSA-KEM,除非您絕望並且您的 RSAES-OAEP 機器接受 OAEP 隨機化作為參數並返回它在解密時*,*您有一個單獨的子程序可以在沒有 RSA 部分的情況下單獨計算 OAEP。

留言 $ m $ 到 RSA 模數 $ n $ ,發件人可以這樣做:

  1. 挑選 $ k_0 \in {0,1}^{256} $ 和 $ r \in {0,1}^{256} $ 均勻隨機。
  2. 計算 $ x = \operatorname{OAEP}_n(k_0, r) $ . (這是填充元素 $ \mathbb Z/n\mathbb Z $ 我們計算模冪之前,將其提升到公共指數的冪 $ e $ .)
  3. 計算 $ k = H(x) $ (例如,使用 HKDF)。
  4. 計算 $ y = \operatorname{RSAES-OAEP}_n(k_0, r) $ 以便 $ y = x^3 \bmod n $ .
  5. 交出鑰匙 $ k $ 及其封裝 $ y $ .

在收到 $ y $ ,收件人可以這樣做:

  1. 計算 $ (k_0, r) = \operatorname{RSAES-OAEP}_n^{-1}(y) $ 如果 RSAES-OAEP 解密失敗,則拒絕。(小心填充預言機攻擊!)
  2. 計算 $ x = \operatorname{OAEP}_n(k_0, r) $ .
  3. 計算並生成密鑰 $ k = H(x) $ .

請注意,這需要一個子程序來計算 OAEP 本身,並且需要公鑰操作 $ \operatorname{RSAES-OAEP}_n $ 接受 OAEP 隨機化 $ r $ 作為要加密的短字元串旁邊的參數,並且需要私鑰操作 $ \operatorname{RSAES-OAEP}_n^{-1} $ 產生 OAEP 隨機化 $ r $ 與短字元串一起加密。

所以最後,雖然作為一個黑盒,這可能(除非我犯了錯誤)與 RSA-KEM 無法區分,但實現起來比僅僅封裝隨機生成的密鑰要復雜得多 $ k_0 $ 就像您最初所做的那樣,將 RSAES-OAEP 作為一種“RSAES-OAEP-KEM”。

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