Aes
我在 AES cfb128 中使用什麼作為加密密鑰和初始化向量
我正在編寫一個可以使用 AES cfb128(使用 Openssl 和 C++)加密文件的程序。
該程序的場景是這樣的:
- 人 A 訪問電腦,加密他們製作的文件,拿走密鑰(在 USB 記憶棒上?)
- B人訪問電腦,無法解密加密文件
- 人 A 回來並使用他們的密鑰解密文件
我的問題是我必須為 AES 加密設置一個加密密鑰和初始化向量。我計劃為一個隨機生成數字並為另一個使用硬體 ID。該人還可以選擇加密多個文件。
那麼我該怎麼做呢?
我可以將加密密鑰設置為 hardwareID 和 init 向量為隨機位序列嗎?
如果使用相同的 hardwareID 和 init 向量來加密每台機器的多個文件,考慮到攻擊者沒有 init 向量但可能擁有加密密鑰,這是否不安全?加密密鑰應該是隨機位,而硬體密鑰應該是初始化向量嗎?
或者加密密鑰和初始化向量是否應該是隨機的並且攻擊者不知道?如果是這樣,使用相同的 2 個未知密鑰加密多個文件是否安全?
您可以使用您的 HardwareID 作為加密密鑰的基礎。如果 ID 提供了足夠的熵,它將起作用。但是,如果任何人都能以某種方式獲得 ID(這可能很容易做到),則可以解密文件。
對於 CFB 模式, IV 確實必須是不可預測的(但不必是秘密的),所以 random 就可以了,但不要重用 IV。
使用相同的密鑰和不同的 IV 加密大量數據就可以了,完全沒有問題。
但是,我想對安全級別提出一些改進。
- 不要使用 CFB 模式,而是使用 EAX/CCM/GCM 模式,因為它們已經過身份驗證,因此您可以“免費”進行身份驗證,無需再擔心。
- 作為基於硬體 ID 的密鑰的替代品,我建議將密鑰(普通 - 不推薦)儲存在 USB 棒上,或者只使用密碼(+ scrypt)或儲存加密的密鑰(AES-GCM + scrypt)在一根棍子上。
- 您可能需要考慮為您加密的每個文件生成一個密鑰,並將此密鑰 (+IV) 儲存為加密文件的“標頭”。標頭將使用密鑰解密(來自 USB/來自密碼/來自 USB+密碼)