Aes

我如何決定使用什麼模式?

  • January 18, 2021

我將使用來自 OpenSSL 的 AES。我通過閱讀Wikipedia article之類的頁面了解為什麼我不想使用 ECB,該文章有一個很好的範例,說明了當您嘗試使用電子密碼本進行加密時會發生什麼。

但是我缺少的是與所有其他模式的某種比較表,因此我了解各種模式的正面和負面。我在哪裡可以找到這些資訊,以便我可以就使用哪種模式做出明智的決定?


更新 1

看起來 OpenSSL 的 EVP api(我認為這是使用 OpenSSL 時推薦的 API?)僅支持 2 種模式

$$ OpenSSL $$$$ 1 $$– GCM 和 CCM – 這大大減少了我的選擇。 1: https://www.openssl.org/docs/crypto/EVP_EncryptInit.html


更新 2

毫不奇怪,該 OpenSSL 頁面有些誤導或不完整。看著/usr/include/openssl/evp.h我發現 AES 有 30 多種變體可供選擇,包括:

  • EVP_aes_*_ecb()
  • EVP_aes_*_cbc()
  • EVP_aes_*_cfb1()
  • EVP_aes_*_ofb()
  • EVP_aes_*_ctr()
  • EVP_aes_*_xts()
  • …還有很多!

所以我又開始閱讀所有不同的模式,這樣我就可以對應該使用的模式做出半智能的選擇。

加密模式有很多不同之處。把它們都放在一張桌子上會很棘手。我建議您做一些工作並通讀NIST 文件中有關 Block cipher mode的內容。

如果您不確定並且沒有特殊要求,您可以檢查 GCM 模式是否可用。它是一種身份驗證模式,還提供密文的完整性/真實性。您還可以在附加驗證數據 (AAD) 中添加任何其他非機密數據,例如配置數據 - 這是密碼的單獨輸入。請注意,GCM 模式對 IV 隨機數/重用造成災難性的失敗(GCM-SIV 模式可以糾正該問題)。

最後,NIST 描述的所有模式——當然除了 ECB 模式,注意 NIST 提示——在正確使用時都是安全的,可以提供機密性。因此,從這個意義上說,在不涉及特定案例的情況下比較它們幾乎沒有意義。

$$ EDIT $$我已經刪除了需要將 IV 放入 AAD 數據的要求。我不知道我寫的時候在想什麼,我沒有得到糾正……

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