Aes

我可以使用 256 位密鑰的一半作為 AES 256 IV 嗎?

  • May 11, 2022

經過一些Google研究,我發現 AES 256 位加密中使用的 IV 必須是 128 位密鑰。

我的 AES256 加密是用隨機 256 位密鑰的密鑰和文本字元串生成的 IV 處理的。

我正在考慮用 MD5 來生成這樣的密鑰,但 MD5 似乎已經過時了。

那麼,如果我使用 SHA256 生成 256 位密鑰而不是將密鑰的十六進製字元串平均分成兩部分並將第一部分用作 AES 256 位加密中的 IV,是否可以?

那麼,如果我使用 SHA256 生成 256 位密鑰而不是將密鑰的十六進製字元串平均分成兩部分並將第一部分用作 AES 256 位加密中的 IV,是否可以?

不,有更好的方法。

首先,當您創建密鑰時,您需要一個加密安全的隨機數生成器。如果您從主密鑰(有時稱為種子)*派生密鑰,則需要密鑰派生函式或 KDF。*在後一種情況下,您可以使用具有良好雜湊值(如 SHA-256)的 HKDF。原則上,您可以使用 HKDF 創建例如 384 位輸出 - 即使使用 SHA-256,但我認為這不是一個好主意,因為答案的以下部分。


其次,重複使用鍵/IV組合不是一個好主意;根據模式和消息,您可能只洩漏部分數據或全部消息。

一般來說,如果密鑰是為每條消息隨機生成的,則可以只使用全零 IV。這比重複使用部分密鑰要好。如前所述,IV 通常不被認為是秘密的,因此如果您使用密鑰數據作為 IV 實現很可能會洩漏它。

如果您需要使用相同的密鑰加密多條消息,那麼您可以使用合成IV 或 SIV。這樣,您只會在消息完全相同的情況下泄漏數據,但會犧牲一些性能,因為 SIV 模式是多通道的(消息需要處理兩次)。

一般來說,儘管您應該只使用隨機 IV 並將其與密文一起發送。從問題中不清楚是否已考慮到這一點;這將是處理 IV 代的最常見方式。


最後,鍵不是字母數字的;它們由位組成。每次將密鑰轉換為文本時,您都會打開一個安全問題。所以不要這樣做:保持密鑰二進制。我寧願使用帶有完全隨機密鑰的 AES-128,並將其他 128 位用於 IV,而不是恢復使用十六進制。

十六進制僅對人類使用有用,例如在涉及密鑰的測試或調試期間。

我假設你沒有透露這個 IV。取決於你想要什麼以及你使用什麼模式。AES 的 IV 對於 OFB、CBC 或 CFB 等模式應為 128 位,但對於 CTR 或其經過身份驗證的變體等模式通常更短,其中創建用於生成流的塊的最常見方法是連接 IV(隨機數)和櫃檯。使用部分密鑰作為 IV 可能會出現很多問題:

我曾經不知道與洩露相關的巨大固有安全風險 $ E_k(k_{0..|k|/2}) $ 或者 $ E_k(k_{0..|k|/2} \oplus P) $ 或者 $ E_k(k_{0..m} || ctr) $ 對於一些已知的消息 $ P $ 對於完整的 AES(如果我錯了,請更正)。這些是您可能會看到的功能,具體取決於所使用的模式。然而,實際使用可能不安全。

  1. 本質上使您的加密具有確定性。所以它並沒有完全隱藏消息。對於 CBC 或 CFB 等模式,您可以檢測公共前綴(消息中的完整塊前綴)。對於CFB,這也可以讓你推斷出對應於第一個不同塊的純文字之間的關係,具體來說 $ P_{1_i} \oplus P_{2_i} $ 密文在哪里分歧 $ i^{th} $ 堵塞。對於 CTR 或 OFB 之類的模式,如果您重用密鑰可能會造成毀滅性的後果,您可以推斷出這兩者的整個純文字的異或關係。即使您使用 MD5 進行 IV,此問題仍然存在。因此,它使得它非常不適合重用,甚至是偶然的,這說起來容易做起來難。
  2. 在某些協議中,如果攻擊者找到獲取 $ E_k(k_{0..|k|/2}) $ 例如通過欺騙加密 $ 0^{|k|} $ 在 CBC 模式下,然後欺騙他們進行加密 $ p_i||c_{i} $ 他在哪裡獲得 $ c_{i} $ 從之前的互動中,以揭示 $ E_k(0^{|k|}) $ ,他可能會通過要求解密來欺騙他們洩露一半的密鑰 $ E_k(0^{|k|}) $ . 這不是我最初的想法,所以我建議您在此處查看 fgrieu 的答案,請參閱缺點 2。
  3. 如果您不重用密鑰或在其他類似協議中使用它可能是安全的。對於像 CBC 甚至 ECB 這樣的模式,帶有一些不知道結構的高熵(隨機)消息也可以,以防您多次使用。

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