Aes

Why don’t all AES encryption tools produce the same key from the same password?

  • May 5, 2019

愛麗絲和鮑勃定期見面。他們已經面對面地同意了一個 128 位密碼,他們想用這個密碼來加密/解密他們之間寫的電子郵件。

他們決定使用 256 位 AES。Alice 寫了她的消息,但發現她用來加密她的文本的每個 AES 256 應用程序都提供了不同的密文。因此,如果不指定加密她的文本的工具,她就無法與 Bob 交流,而且她無法通過與其他工具進行比較來檢查該工具是否真實。

為什麼貌似沒有標準算法?為什麼沒有可以為此目的下載和離線使用的簡單且受信任的工具(例如 javascript 文件)?

這裡有兩件事:

  • 加密使用操作模式,而不是“單獨的 AES”。其中一些是通過初始化向量隨機化的——這意味著在相同算法下對相同文本的加密仍然是隨機的,而不是確定性的。加密方法可以解決這個問題。您只需要正確的密鑰即可解密。
  • 密碼不是鑰匙。如果您親自見面,您可以創建一個真正的隨機密鑰。這意味著每個位都獨立於 $ {0,1} $ ,而不僅僅是一定長度的密碼,任何字典都能查到。如果您想使用密碼或密碼片語,則建議您使用正確的密碼密鑰派生函式,例如PBKDF2bcryptscrypt(今天的大多數建議都使用 scrypt)。

工具的問題在於,如果他們只是在頂部寫上“AES”,那並不意味著他們在內部使用相同的模式或相同的密鑰派生函式。如果他們這樣做,那麼解密將起作用。儘管如此,仍然存在非確定性模式,其中明確的目標是無法將加密兩次的相同消息與隨機亂碼區分開來。

您所能做的就是實際測試您可用的工具(如果它們協同工作)。您可以堅持使用經過驗證的流行實現。永遠不要使用一些業餘的實現——永遠不要實現你自己的加密。

那是因為 AES 不是基於密碼的加密算法。這是一個分組密碼。它可能看起來像一個細節,但這些細節很重要。在密碼學和一般安全性中,細節通常很重要。

AES 是一對函式,每個函式接受一個密鑰和一個 128 位消息並產生一個 128 位消息。這兩個函式稱為加密和解密,它們是相反的。密鑰的長度必須是 128 位、192 位或 256 位。

如果要加密長度不完全為 128 位的消息,則不能僅使用 AES。你需要使用一種操作方式。一種操作模式描述瞭如何將消息分解為 128 位並組合它們,並呼叫 AES 加密和解密函式來加密或解密任意長度的消息。操作模式通常根據連結(處理多個塊)和填充(處理最後一個部分塊)來定義。有一些操作模式定義瞭如何加密消息(例如 CBC、CTR)、如何驗證消息(例如 CMAC、GMAC)或兩者(例如 GCM、XTS)。

此外,體面的操作模式需要某種方式來確保重複加密同一消息每次都會產生不同的密文。否則,看到兩條加密消息的對手至少可以判斷它們是否相同,或者通常它們是否具有相同的前綴,如果沒有正確完成,某些模式(如CTR)會出現更糟糕的失敗模式。所有常見模式都使用唯一值來“啟動”加密;對於大多數模式,這個唯一值稱為初始化向量(IV)。

因此,要定義如何使用 key 加密消息,您需要指定幾件事:

  • AES 作為分組密碼(如果使用基於 AES 的密碼);
  • 使用哪種操作模式;
  • IV如何與密文一起傳輸。對於最後一個,有一個事實上的標準,即連接 IV 和密文。

例如,AES-CBC 是一種基於密鑰的消息加密算法。AES-CTR 也是如此。AES-GCM 是一種基於密鑰的消息認證加密算法。

仍然存在從密碼製作密鑰的問題。AES 密鑰必須是三種標準長度之一,因此需要進行從密碼到密鑰的確定性轉換。將密碼(或任何其他類型的輸入)轉換為密鑰稱為密鑰派生。當密碼對人類來說是容易記住的,它需要被拉伸。密鑰拉伸本質上是一種緩慢的操作,因此通過蠻力嘗試可能的密碼的攻擊者每次嘗試都必須花費大量資源。目前有四種常見的密鑰拉伸算法家族,也稱為基於密碼的密鑰派生函式:Argon2scryptbcryptPBKDF2(大致從最喜歡到最不喜歡,但仍然可以)。其中每一個都是一個密鑰拉伸函式(或一系列類似設計的函式),它從三個參數計算一個拉伸密鑰:密碼、鹽(允許從同一個密碼派生多個密鑰)和難度參數(越大越慢;以最簡單的形式,這是一個迭代計數)。

因此,為了指定密鑰是如何從密碼中派生的,您需要說“PBKDF2 with the salt "ms8321damidj"and with 1000 iterations”。鹽應該是公開的但隨機的(它可以與加密消息一起發送),以便攻擊者無法進行任何預計算來破解許多密碼。迭代次數是低(更容易破解)和高(需要合法使用者更多的處理能力)之間的折衷。

總之,要指定如何使用密碼對消息進行加密,您需要指定:分組密碼¹、操作模式、密鑰派生函式、密鑰派生參數(鹽和迭代次數)以及額外參數如何(IV,鹽,迭代計數)與消息中的密文一起編碼。這是相當大的變化空間。

¹假設這就是您要做的,因為這裡有其他類型的密碼,例如流密碼,但您所獲得的只是不必指定操作模式。

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