Rsa

RSA 加密 AES 密鑰。AES IV 怎麼樣?

  • October 15, 2021

我需要將 AES 密鑰安全地傳遞給遠端客戶端。到目前為止,我所做的是生成一個隨機 AES 密鑰並使用客戶端的 RSA 公鑰對其進行加密(PKCS#1 v1.5 填充由我正在使用的 RSA 庫 CryptJS 負責)。

我沒有意識到 AES 需要密鑰但也需要 IV。我不知道處理 IV 的正確方法是什麼。我是否也應該對其進行加密並基本上發送兩個加密的 blob?(一個用於 AES 密鑰,一個用於 IV)。或者我可以安全地將 IV 附加到 AES 密鑰本身並加密生成的字節數組嗎?

我使用的是 RSA 2048bit,所以我肯定可以加密 128+128=256bit 長的有效載荷。

如果我將 IV 附加到 AES 密鑰並 RSA 加密生成的字節數組,是否有任何安全隱患?

我找不到任何關於此的最佳實踐。我什至不知道在不加密的情況下直接發送 IV 是否安全。

這可能會作為副本關閉,但 IV 不必保密。不確定最佳實踐,但我認為在 RSA 加密中包含 IV 沒有問題。

如果您已經擁有隨每條消息更改的隨機密鑰,您甚至不需要隨機 IV。因此,任何答案都不會是根本錯誤的,因為 IV 沒有安全要求。但是,我建議您在遇到不太友好的 BEAST 之前閱讀我們友好的熊提供的這個答案。

但是,出於一個特殊原因,我不會將 IV 包含在 AES 輸入密鑰中:它與執行密鑰包裝的任何硬體或 HSM(或任何其他密鑰庫)不兼容(即使用包裝密鑰加密密鑰,在你的情況是 RSA 公鑰)。因此,如果您決定需要它,則必須更改協議。否則,您必須解密並將密鑰儲存在軟體中。老實說,這不是一個大問題,因為無論如何數據都會在記憶體中,但這是需要考慮的問題。

如果您堅持使用隨機 IV,那麼您可以使用包裝密鑰(即 RSA 密文)上的散列作為 IV,或者您可以從包裝密鑰材料本身(使用密鑰派生函式或 KDF)派生它。後者可能是這里大多數密碼學家使用的方法之一,儘管它更難理解和實施(例如 RSA-KEM,然後是 HKDF-Extract,然後是 2 次 HKDF-Expand - 一次用於密鑰,一次用於 IV - 儘管這也可能與許多硬體不兼容)。


如評論中所述,擁有經過身份驗證的消息通常非常重要。這通常需要sign-then-encrypt,但是如果您打算使用該模式,那麼它很容易受到對 PKCS#1 和 CBC 的填充 oracle 攻擊。如果您只考慮一個收件人以及機密性和完整性,那麼加密然後簽名可能更適合您。

這當然也需要在接收器處有一個(受信任的)RSA 密鑰對,最終這一切都與密鑰管理有關。

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