Aes

我在 AES cfb128 中使用什麼作為加密密鑰和初始化向量

  • April 8, 2015

我正在編寫一個可以使用 AES cfb128(使用 Openssl 和 C++)加密文件的程序。

該程序的場景是這樣的:

  • 人 A 訪問電腦,加密他們製作的文件,拿走密鑰(在 USB 記憶棒上?)
  • B人訪問電腦,無法解密加密文件
  • 人 A 回來並使用他們的密鑰解密文件

我的問題是我必須為 AES 加密設置一個加密密鑰和初始化向量。我計劃為一個隨機生成數字並為另一個使用硬體 ID。該人還可以選擇加密多個文件。

那麼我該怎麼做呢?

我可以將加密密鑰設置為 hardwareID 和 init 向量為隨機位序列嗎?

如果使用相同的 hardwareID 和 init 向量來加密每台機器的多個文件,考慮到攻擊者沒有 init 向量但可能擁有加密密鑰,這是否不安全?加密密鑰應該是隨機位,而硬體密鑰應該是初始化向量嗎?

或者加密密鑰和初始化向量是否應該是隨機的並且攻擊者不知道?如果是這樣,使用相同的 2 個未知密鑰加密多個文件是否安全?

您可以使用您的 HardwareID 作為加密密鑰的基礎。如果 ID 提供了足夠的熵,它將起作用。但是,如果任何人都能以某種方式獲得 ID(這可能很容易做到),則可以解密文件。

對於 CFB 模式, IV 確實必須是不可預測的(但不必是秘密的),所以 random 就可以了,但不要重用 IV

使用相同的密鑰和不同的 IV 加密大量數據就可以了,完全沒有問題。


但是,我想對安全級別提出一些改進。

  1. 不要使用 CFB 模式,而是使用 EAX/CCM/GCM 模式,因為它們已經過身份驗證,因此您可以“免費”進行身份驗證,無需再擔心。
  2. 作為基於硬體 ID 的密鑰的替代品,我建議將密鑰(普通 - 不推薦)儲存在 USB 棒上,或者只使用密碼(+ scrypt)或儲存加密的密鑰(AES-GCM + scrypt)在一根棍子上。
  3. 您可能需要考慮為您加密的每個文件生成一個密鑰,並將此密鑰 (+IV) 儲存為加密文件的“標頭”。標頭將使用密鑰解密(來自 USB/來自密碼/來自 USB+密碼)

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